先日、Oracleで1つにカンマ区切り文字列を行変換する例を書いた
文字列のsplit ⇒ 行処理するSQL (ORACLE) - Oboe吹きプログラマの黙示録
1つではなく、複数のカンマ区切り文字列から、TABLE を作成する方法は、以下のように、
TABLE(CAST(MULTISET( 区切りレベル CONNECT BY REGEXP_SUBSTR 対象を
各々に適用させれば良い。
例)
WITH prefcture_strings AS ( SELECT '東京,神奈川,千葉,茨城' AS value FROM dual ), prfctcd_strings AS ( SELECT '13,14,12,08' AS value FROM dual ), point_strings AS ( SELECT '100,80,60,55' AS value FROM dual ), splits AS ( SELECT lines.column_value AS ROWNO , TRIM(REGEXP_SUBSTR(prefcture_strings.value,'[^,]+', 1, lines.column_value)) AS PREFECTURE , TRIM(REGEXP_SUBSTR(prfctcd_strings.value,'[^,]+', 1, lines.column_value)) AS PRFCTCD , TRIM(REGEXP_SUBSTR(point_strings.value,'[^,]+', 1, lines.column_value)) AS POINT FROM prefcture_strings, prfctcd_strings, point_strings ,TABLE(CAST(MULTISET(SELECT LEVEL FROM dual CONNECT BY REGEXP_SUBSTR(prefcture_strings.value, '[^,]+', 1, LEVEL) IS NOT NULL) AS sys.odciNumberList )) lines ) SELECT ROWNO , PREFECTURE , PRFCTCD , POINT FROM splits
FROM句で対象を並べ、REGEXP_SUBSTR で各カンマ区切り文字列 FROM dual を指定する。
splits テーブルSELECT結果は以下のようになる。
| ROWNO | PREFECTURE | PRFCTCD | POINT |
| 1 | 東京 | 13 | 100 |
| 2 | 神奈川 | 14 | 80 |
| 3 | 千葉 | 12 | 60 |
| 4 | 茨城 | 08 | 55 |
区切りの数が全て同じであることが前提である。