これは改善された方法かもしれません(正規表現と接続方法もあります):
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
編集 :ここに、クエリの簡単な(「詳細ではない」などの)説明があります。
-
length (regexp_replace(t.error, '[^,]+')) + 1
regexp_replace
を使用します 区切り文字(この場合はカンマ)およびlength +1
以外のものをすべて消去します そこにある要素(エラー)の数を取得します。 -
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
-
table(cast(multiset(.....) as sys.OdciNumberList))
オラクルタイプのキャストを行います。-
cast(multiset(.....)) as sys.OdciNumberList
複数のコレクション(元のデータセットの各行に1つのコレクション)を単一の数値コレクションOdciNumberListに変換します。 -
table()
関数はコレクションを結果セットに変換します。
-
-
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
-
trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))
column_value
を使用します nth_appearance / ocurrenceとしてregexp_substr
のパラメーター 。 - データセットから他の列を追加できます(
t.name, t.project
例として)簡単に視覚化できます。
Oracleドキュメントへの参照:
- REGEXP_REPLACE
- REGEXP_SUBSTR
- 拡張性の定数、タイプ、およびマッピング(OdciNumberList)
- CAST(マルチセット)
- 階層クエリ