ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PostfresSQL 正規表現を使って数字を取り出し、データを並べ替え

データの並べ替えにおいて、以下のようなデータの場合、単純に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

www.postgresql.jp

コンピュータを操作中
unsplash-logoNESA by Makers

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


同じ結果を得られましたが、正規表現を使う方が「数字を取り出してソートキーを生成している」という目的がわかりやすいです。