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

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

PostgreSQL:条件式と文字列連結を使って、ハイフン(-)を付けた結果を取得できた

代表者と同行者を同時に登録するシステムがあります。
登録されたデータの出力時、縦並びにデータを出力していて、番号は同じ番号にしていました。
番号を同じにしたのは、同行者とわかりやすくするためです。

番号 名前
1 参加壱番
1 同行壱番
1 同行弐番
2 参加弐番
2 同行参番

同行者に枝番を付ける

参加者の番号はそのままで、同行者に枝番をつけて欲しいとの要望がありました。
イメージは以下のようになります。
番号 名前
1 参加壱番
1-1 同行壱番
1-2 同行弐番
2 参加弐番
2-1 同行参番

データはあるので対応は可能

データベース上は、idで番号を保持していて、sub_idで代行者と同行者に1から連番を割りふっています。
id sub_id name
1 1 参加壱番
1 2 同行壱番
1 3 同行弐番
2 1 参加弐番
2 2 同行参番

SQLでsub_idも取得して、プログラム上で判定して結合すれば対応は可能です。

SELECT id, sub_id, name
FROM table1

SQLで対処して、なるべくプログラムを簡潔にする

プログラムで対応できることは確認しましたが、SQLでもできると思ったので、調べてみました。
結果、以下のようになりました。

SELECT CASE WHEN sub_id - 1 = 0 THEN id
            ELSE id || '-' || sub_id - 1
       END AS no,
       name
FROM table1

条件式のCASEで、sub_idから1を引いた結果が0だったら、idだけを結果とします。
0ではなかったら、文字列連結の||を使って、idとsub_idをハイフン(-)で連結して結果とします。
判定時に1を引いているのは、同行者の枝番として1を引くので、同様にした方がわかりやすいと考えたからです。

まとめ

プログラムでの対処とSQLでの対処のどちらがよりわかりやすく、効率がいいのか悩みますが、プログラムが簡潔な方を望むので、SQLでの対処を選択しました。