データの並べ替えにおいて、以下のようなデータの場合、単純にlabelの値を使って並べ替えると、数字部分に桁数を揃えるのための先頭のゼロ埋めがないため、「ラベル11.」→「ラベル2.」→「ラベル5.」の順番になってしまいます。
label | data |
---|---|
ラベル5. | データ2 |
ラベル2. | データ3 |
ラベル11. | データ8 |
substring関数で数字部分の文字数を指定して取り出す
「ラベル」の部分は共通しているので、PostgreSQLのsubstring関数で4文字目から2文字取り出せば、それぞれ「5.」「2.」「11」になります。
substring関数は
substring(label from 4 for 2)
と書きます。
www.postgresql.jp
実際のSQLは、文字列を数値に変換するto_number関数を使って数値に変換してから並べ替えます。
SELECT to_number(substring(label from 4 for 2),'99') AS sort_key, * FROM data_tabel ORDER BY sort_key ASC
substring関数で数字部分を正規表現で取り出す
上記の方法でも目的通りに並べ替えはできました。
文字数が決まっているのでできましたが、一定の文字数ではない場合は対処できません。
PostgreSQLでは正規表現が使えるは以前書いて知っていたので、数字の文字列を取り出すためにも使えないか試してみました。
ajya.hatenablog.jp
試した結果、以下のようになりました。
SELECT to_number( substring(label from '[0-9]+'),'99') AS sort_key, * FROM data_tabel ORDER BY sort_key ASC
同じ結果を得られましたが、正規表現を使う方が「数字を取り出してソートキーを生成している」という目的がわかりやすいです。