トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-25 1行を複数行に変換

SQLパズル

tab1テーブル
FLD1
---------------
101/102/103
105/102/109/108
110/111/112
9990/9993

tab1テーブルのデータを、出力結果のように出力する。

出力結果
FLD1
----
 101
 102
 103
 105
 102
 109
 108
 110
 111
 112
9990
9993

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table tab1(FLD1) as(
values('101/102/103'),
      ('105/102/109/108'),
      ('110/111/112'),
      ('9990/9993'));


SQL

--■■■regexp_split_to_table関数を使う方法■■■
select FLD1,regexp_split_to_table(FLD1,'/') as splitedFld
  from tab1;

--■■■再帰with句を使う方法■■■
with recursive tmp(FLD1,resultFunc) as(
select FLD1,regexp_split_to_array(FLD1,'/')
  from tab1),
rec(FLD1,resultFunc,subFLD1,LV) as(
select FLD1,resultFunc,resultFunc[1],1
  from tmp
union all
select FLD1,resultFunc,resultFunc[LV+1],LV+1
  from rec
 where LV < array_upper(resultFunc,1))
select*from rec order by FLD1,LV;


解説

select句でのregexp_split_to_table関数の使用は非推奨なので、
再帰with句を使うほうがいいと思われますねぇ

34.4.7. 集合を返すSQL関数

SQL関数がSETOF sometypeを返すよう宣言されている場合、
関数の最後の問い合わせは最後まで実行され、各出力行は結果集合の要素として返されます。

この機能は通常、関数をFROM句内で呼び出す時に使用されます。

現在、集合を返す関数は問い合わせの選択リスト内でも呼び出すことができます。
問い合わせ自身によって生成する各行に対し、集合を返す関数が呼び出され、
関数の結果集合の各要素に対して出力行が生成されます。
ただし、この機能は現在では推奨されておらず、今後のリリースでは削除される可能性があります。