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を引くので、同様にした方がわかりやすいと考えたからです。