MySQL の LPAD()・RPAD()
ここでは MySQL の LPAD() と RPAD() 関数についてご説明します。
サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。
MySQL の LPAD() 関数の使い方
MySQL の LPAD() 関数は、文字列が指定した長さに満たない場合に、その桁数まで文字列の左側に指定した文字を埋めてくれる関数です。
LPAD(文字列, 長さ, 埋める文字)
桁数を合わせるために、ゼロ埋めをしたい時などに便利です。
指定した長さが文字列の長さより短い場合は、文字列の前からその長さまでの文字が返ります。
埋める文字が 2 文字以上の場合は、埋める必要の文字数になるまで、埋める文字が繰り返されます。
それでは、LPAD() 関数を使って、右寄せでゼロ埋めしてみます。
SET @str = 'ABCDE';
SELECT LPAD(@str, 10, '0'),
LPAD(@str, 4, '0'),
LPAD(@str, 18, '123');
[実行結果]
3 行目の LPAD(@str, 10, '0') は、10 桁になるまで右寄せでゼロ埋めされて、’00000ABCDE’ を返しています。
4 行目の LPAD(@str, 4, '0') は、4 桁は元の文字列の長さより短いので、'ABCDE' の左から 4 桁の'ABCD'を返しています。
5 行目の LPAD(@str, 18, '123') は、'ABCDE’ が右寄せされて、18 桁 になるまで、左から '123' が繰り返されています。
MySQL の RPAD() 関数の使い方
MySQL の RPAD() 関数は、文字列が指定した長さに満たない場合に、その桁数まで文字列の右側に指定した文字を埋めてくれる関数です。
右に寄せるか左に寄せるかが違うだけで、使い方は LPAD() 関数と同じです。
RPAD(文字列, 長さ, 埋める文字)
先ほどと同じクエリーを、RPAD() 関数に変えて、左寄せでゼロ埋めしてみます。
SET @str = 'ABCDE';
SELECT RPAD(@str, 10, '0'),
RPAD(@str, 4, '0'),
RPAD(@str, 18, '123');
[実行結果]
3 行目の RPAD(@str, 10, '0') は、10 桁になるまで左寄せでゼロ埋めされて、’ABCDE00000’ を返しています。
4 行目の RPAD(@str, 4, '0') は、4 桁は元の文字列の長さより短いので、'ABCDE' の左から 4 桁の'ABCD'を返しています。
5 行目の RPAD(@str, 18, '123') は、'ABCDE’ が左寄せされて、18 桁 になるまで、左から '123' が繰り返されて 'ABCDE1231231231231' を返しています。
LPAD() と ROW_NUMBER() を使って学籍番号を生成する
LPAD() 関数と ROW_NUMBER() 関数を使って、テーブルのレコードをソートして、一意となる番号を生成することもできます。
今回は以下のような students テーブルのレコードに対して、学籍番号を生成してみます。
この students テーブルのレコードを、last_name, first_name の順番でソートして、ST000000001 のような 10 桁の学籍番号を生成するには次のようにできます。
SELECT CONCAT('ST', LPAD(ROW_NUMBER() OVER (ORDER BY last_name, first_name), 8, '0')) AS student_no,
student_id,
first_name,
last_name
FROM students;
[実行結果]
まず、ROW_NUMBER() OVER (ORDER BY last_name, first_name) で last_name, first_name の順番でソートした連番を取得しています。
その連番の左側に LPAD() 関数を使って 8 桁になるまでゼロ埋めしています。
最後に CONCAT() 関数で先頭に 'ST' をつけて、学籍番号を生成しています。
以上、MySQL の LPAD() と RPAD() 関数についてご説明しました。