1セルに複数の値が入った状態のレコードを分割して、別レコードとして扱う場合に便利な関数があったのでメモ(PostgreSQL)
確認環境
select version(); PostgreSQL 9.6.4 on x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
データ例とやりたいこと
下記の配車テーブルを例にします。
「メンバー」列には、「;」区切りで複数の値が入っていると。本来は1セル1人とすべきですが、1セルに複数の値が入っているという状態です。
やりたいことは、1セル1人にしたいということです。
号車 | メンバー | 乗車日 |
---|---|---|
1 | 剛;尚美;涼;彩夏;浩平 | 2020-01-20 |
2 | 樹;謙二;沙耶香;昇一;利香 | 2020-01-20 |
3 | 岳大;真利子;貞雄;江梨子;麻梨 | 2020-01-20 |
4 | 剛秀;重夫;美嘉;絵梨佳;莉緒 | 2020-01-20 |
SQL
ストアドプロシージャが必要かと思ったのですが、PostgreSQLには「regexp_split_to_table」という文字列関数があるので、そちらを使います。
select 号車 ,regexp_split_to_table(メンバー, ';') as メンバー ,乗車日 from 配車テーブル
https://www.postgresql.jp/document/8.3/html/functions-string.html
実行結果
やりたいことが実現できました。シンプルで便利
号車 | メンバー | 乗車日 |
---|---|---|
1 | 剛 | 2020-01-20 |
1 | 尚美 | 2020-01-20 |
1 | 涼 | 2020-01-20 |
1 | 彩夏 | 2020-01-20 |
1 | 浩平 | 2020-01-20 |
2 | 樹 | 2020-01-20 |
2 | 謙二 | 2020-01-20 |
2 | 沙耶香 | 2020-01-20 |
2 | 昇一 | 2020-01-20 |
2 | 利香 | 2020-01-20 |
3 | 岳大 | 2020-01-20 |
3 | 真利子 | 2020-01-20 |
3 | 貞雄 | 2020-01-20 |
3 | 江梨子 | 2020-01-20 |
3 | 麻梨 | 2020-01-20 |
4 | 剛秀 | 2020-01-20 |
4 | 重夫 | 2020-01-20 |
4 | 美嘉 | 2020-01-20 |
4 | 絵梨佳 | 2020-01-20 |
4 | 莉緒 | 2020-01-20 |