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よりも長い場合
string
がlength
よりも長い場合、string
はlength
で指定された長さに切り詰められます。
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_string
がNULL
の場合:
いずれかの引数が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クエリをより柔軟かつ効果的に記述しましょう。
コメント