管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

セル内の文字列を分割して別レコードとして扱う(regexp_split_to_table)(PostgreSQL)

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