Oracleで文字列を複数の行に分割する 質問する

Oracleで文字列を複数の行に分割する 質問する

この質問は PHP と MYSQL である程度回答されていることは承知していますが、Oracle 10g (できれば) および 11g で文字列 (カンマ区切り) を複数の行に分割する最も簡単な方法を教えていただけないでしょうか。

表は以下のとおりです。

Name | Project | Error 
108    test      Err1, Err2, Err3
109    test2     Err1

以下を作成したいです:

Name | Project | Error
108    Test      Err1
108    Test      Err2 
108    Test      Err3 
109    Test2     Err1

スタックに関する潜在的な解決策をいくつか見てきましたが、それらは単一の列(コンマで区切られた文字列)のみを対象としていました。ご協力いただければ幸いです。

ベストアンサー1

これは改善された方法かもしれません (正規表現と接続も使用):

with temp as
(
    select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
order by name

編集: クエリの簡単な(つまり、「詳細ではない」)説明を次に示します。

  1. length (regexp_replace(t.error, '[^,]+')) + 1regexp_replace区切り文字 (この場合はカンマ) 以外のものを消去し、length +1要素 (エラー) がいくつあるかを取得するために使用します。
  2. select level from dual connect by level <= (...)階層クエリ見つかった一致数が 1 からエラーの合計数まで増加する列を作成します。

    プレビュー:

    select level, length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1 as max 
    from dual connect by level <= length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1
    
  3. table(cast(multiset(.....) as sys.OdciNumberList))Oracle 型のキャストをいくつか行います。
    • cast(multiset(.....)) as sys.OdciNumberList複数のコレクション (元のデータ セットの各行に 1 つのコレクション) を単一の数値コレクション OdciNumberList に変換します。
    • このtable()関数はコレクションを結果セットに変換します。
  4. FROM結合せずに作成するとクロス結合データセットとマルチセット間の結果です。その結果、データセット内の 4 つの一致がある行は 4 回繰り返されます (「column_value」という名前の列の数字が増加します)。

    プレビュー:

    select * from 
    temp t,
    table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
    
  5. trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))column_valuen番目の出現/発生のパラメータregexp_substr
  6. 簡単に視覚化できるように、データ セットから他の列をいくつか追加できます (t.name, t.project例として)。

Oracle ドキュメントへの参照:

おすすめ記事