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

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

PostgreSQL:特定の区切り文字で連結されて1カラムに入っているデータを、分割して複数のレコードとして取得する方法の補足

スポンサーリンク

1年ほど前に書いたSQLの記事を改めて読んで、どのような動作になっているのかわかりにくい部分があると感じたので、補足する記事です。
ajya.hatenablog.jp

元のデータは以下とします。

番号(no) 名前(name)
1 大沼 直輝
2 金谷 凌
3 青井 敬三/表 博康
4 八尾 功二
5 春日井 伸次/鴨川 克成/川平 将大
6 有沢 竜平/神埼 修吾
注:名前はジェネレータでランダム生成しています。


SPLIT_PARTで分割して、UNIONで結合した状態は以下のようになります。
SPLIT_PARTの第3パラメータに指定したフィールドが無い場合、空文字列になりました。

分割後の名前(name2) 番号(no) 名前(name)
大沼 直輝 1 大沼 直輝
1 大沼 直輝
1 大沼 直輝
金谷 凌 2 金谷 凌
2 金谷 凌
2 金谷 凌
青井 敬三 3 青井 敬三/表 博康
表 博康 3 青井 敬三/表 博康
3 青井 敬三/表 博康
八尾 功二 4 八尾 功二
4 八尾 功二
4 八尾 功二
春日井 伸次 5 春日井 伸次/鴨川 克成/川平 将大
鴨川 克成 5 春日井 伸次/鴨川 克成/川平 将大
川平 将大 5 春日井 伸次/鴨川 克成/川平 将大
有沢 竜平 6 有沢 竜平/神埼 修吾
神埼 修吾 6 有沢 竜平/神埼 修吾
6 有沢 竜平/神埼 修吾


WHERE name2 <> ''で空文字列を除外します。

分割後の名前(name2) 番号(no) 名前(name)
大沼 直輝 1 大沼 直輝
金谷 凌 2 金谷 凌
青井 敬三 3 青井 敬三/表 博康
表 博康 3 青井 敬三/表 博康
八尾 功二 4 八尾 功二
春日井 伸次 5 春日井 伸次/鴨川 克成/川平 将大
鴨川 克成 5 春日井 伸次/鴨川 克成/川平 将大
川平 将大 5 春日井 伸次/鴨川 克成/川平 将大
有沢 竜平 6 有沢 竜平/神埼 修吾
神埼 修吾 6 有沢 竜平/神埼 修吾

このような処理を行って、1カラムに入っているデータを分割して、複数のレコードにしています。


f:id:AJYA:20180323125952j:plain
unsplash-logoMarkus Spiske