MySQLのLPAD関数の使い方!文字列を左側から指定文字で埋める

MySQL

MySQLのLPAD関数は、指定した文字列を左側から特定の文字で埋め、指定された長さにするために使用されます。
「桁数がバラバラなIDを見やすく整えたい」「ゼロ埋めされた注文番号を作りたい」そんなときに役立つのがLPAD関数です。

数値データのゼロ埋め、固定長フィールドの生成、コードやIDの整形など、文字列の長さを揃えたい場合に非常に役立ちます。
この記事では、LPAD関数の基本的な使い方、埋める文字の指定、長さの制御、そして使用する際の注意点について解説します。

LPAD関数の基本的な構文

LPAD関数の基本的な構文は以下の通りです。

LPAD(string, length, pad_string)
  • string: パディング(埋め込み)を行いたい元の文字列。カラム名、文字列リテラル、または他の関数から返される文字列を指定できます。
  • length: 結果として得られる文字列の全体の長さ(文字数)を指定する正の整数。
  • pad_string: string の左側を埋めるために使用する文字または文字列。通常は1文字を指定しますが、複数文字も可能です。

この関数は、string の左側に pad_string を繰り返し追加し、length で指定された長さになるように調整した文字列を返します。

LPAD関数の使用例

いくつか具体的な例を見てみましょう。

例1:基本的なパディング(1文字で埋める)

SELECT LPAD('abc', 5, '0');
-- 結果: '00abc'

この例では、’abc’ の左側に ‘0’ を2つ追加し、長さ5の文字列にしています。

例2:指定した文字が複数文字の場合

pad_string に複数文字を指定した場合、それが繰り返し使われます。

SELECT LPAD('id', 8, 'X_');
-- 結果: 'X_X_X_id'

この例では、pad_stringが’X_’なので、これらが繰り返されて埋められます。最後の’X_’は途中で切れます。

例3:元の文字列がlengthよりも長い場合

stringlengthよりも長い場合、stringlengthで指定された長さに切り詰められます

SELECT LPAD('TooLongString', 5, '-');
-- 結果: 'TooLo'

この場合、埋める処理は行われず、文字列が短縮されます。

例4:カラムからの抽出と整形

ordersテーブルにorder_idカラムがあり、これを固定長6桁でゼロ埋めして表示したい場合です。

SELECT order_id, LPAD(order_id, 6, '0') AS formatted_order_id
FROM orders
WHERE order_date = '2025-06-20';
-- 例: order_id が 123 の場合 -> '000123'
-- 例: order_id が 4567 の場合 -> '004567'

例5:日本語(マルチバイト文字)の扱い

MySQLのデフォルトの文字セット(UTF-8など)では、LPAD関数は文字数単位で処理されます。

SELECT LPAD('テスト', 6, '補');
-- 結果: '補補補テスト'

LPAD関数における長さ指定の注意点

  • length は正の整数: length には正の整数を指定する必要があります。負の値を指定すると、結果は空文字列になります。
  • length が 0 の場合: 結果は空の文字列になります。
  • string または pad_stringNULL の場合:
    いずれかの引数が NULL の場合、結果は NULL になります。
SELECT LPAD('abc', 5, NULL); -- 結果: NULL
SELECT LPAD(NULL, 5, '0');   -- 結果: NULL

LPAD関数と他の文字列関数の組み合わせ

LPAD関数は、他の文字列関数と組み合わせて、より複雑なデータ操作を行うことができます。

例1:数値データを文字列に変換してゼロ埋め

productsテーブルのstock_quantityカラムを常に3桁でゼロ埋めして表示したい場合です。

SELECT product_name, LPAD(stock_quantity, 3, '0') AS formatted_stock
FROM products;
-- 例: stock_quantity が 5 の場合 -> '005'
-- 例: stock_quantity が 120 の場合 -> '120'

例2:日付の月や日をゼロ埋めして整形

DATE_FORMATを使うのが一般的ですが、LPADを使って手動でゼロ埋めすることも可能です。

SELECT
    CONCAT(YEAR(order_date), '-', LPAD(MONTH(order_date), 2, '0'), '-', LPAD(DAY(order_date), 2, '0')) AS formatted_date
FROM orders
WHERE order_id = 789;
-- 例: order_date が '2025-06-05' の場合 -> '2025-06-05'

例3:IDの先頭を特定のプレフィックスで埋める

システム内で生成される短いIDを、より認識しやすい固定長に整形したい場合です。

SELECT LPAD(user_id, 8, 'USER-') AS padded_user_id
FROM users
WHERE user_id = 42;
-- 結果: 'USER-042' (想定されるIDの長さとpad_stringの長さで調整)
-- LPAD('42', 8, 'USER-') の場合、結果は 'USER-42' になります
-- 厳密に固定長にするには、pad_stringを1文字にして、LENGTH()などで調整することもあります。
-- 例: LPAD('42', 8, '0') の方が一般的 -> '00000042'

LPAD関数を使う際の注意点

  • 文字セットと照合順序: MySQLの文字セット(特にUTF-8などのマルチバイト文字セット)と照合順序の設定によって、文字の扱いが異なる場合があります。通常は文字単位で動作しますが、特殊なケースではバイト単位での処理が必要になることもあります。
  • RPADとの違い: LPADは左側から埋めるのに対し、RPADは右側から埋めます。用途に応じて使い分けましょう。
  • 固定長フィールドの出力: レポート作成などで、特定のカラムの値を常に同じ長さにしたい場合に非常に便利です。特に数値IDや日付の一部をゼロ埋めする際によく利用されます。

具体的な使用例

例1:請求書番号のゼロ埋め

invoices テーブルの invoice_number を常に8桁でゼロ埋めして表示します。

SELECT
    invoice_id,
    LPAD(invoice_number, 8, '0') AS formatted_invoice_number,
    invoice_amount
FROM invoices;
-- 例: invoice_number が 12345 の場合 -> '00012345'

例2:製品ロット番号の統一表示

batch_logs テーブルに lot_number があり、これを固定長10桁で ‘LOT-‘ とゼロで埋めたい場合です。

SELECT
    batch_date,
    LPAD(CONCAT('LOT-', lot_number), 10, '0') AS formatted_lot_number
FROM batch_logs;
-- 例: lot_number が 54321 の場合 -> '000LOT-54321' (CONCAT後の文字列長を考慮して全体をパディング)
-- より現実的には、ID部分のみをゼロ埋めしてCONCATすることが多い
SELECT
    batch_date,
    CONCAT('LOT-', LPAD(lot_number, 5, '0')) AS formatted_lot_number
FROM batch_logs;
-- 例: lot_number が 54321 の場合 -> 'LOT-54321'
-- 例: lot_number が 123 の場合 -> 'LOT-00123'

例3:ユーザーからのコード入力を整形

ユーザーが入力したクーポンコードが短い場合、固定長にするために左側をアスタリスクで埋めます。

SELECT
    coupon_code,
    LPAD(coupon_code, 10, '*') AS masked_coupon_code
FROM user_coupons;
-- 例: coupon_code が 'ABCDE' の場合 -> '*****ABCDE'

まとめ

MySQLの LPAD 関数は、文字列の左側を指定した文字で埋め、特定の長さに整形できる非常に便利な関数です。
数値IDのゼロ埋め、コードの形式統一、レポートの可読性向上など、様々な場面で活躍します。

length パラメータの挙動、pad_string の指定方法、そしてRPADとの違いを理解して、SQLクエリをより柔軟かつ効果的に記述しましょう。

コメント