Oracle では、正規表現と階層クエリを組み合わせて使用して、カンマ区切りの文字列を複数行に分割できます。これを達成する方法に関する完全なガイドは次のとおりです:
問題ステートメント:
次の構造を持つテーブルがあるとします:
<code>名称 | 项目 | 错误 -------------- 108 | test | Err1, Err2, Err3 109 | test2 | Err1</code>
「error」列を複数の行に変換すると、結果は次のようになります:
<code>名称 | 项目 | 错误 -------------- 108 | test | Err1 108 | test | Err2 108 | test | Err3 109 | test2 | Err1</code>
解決策:
<code class="language-sql">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 <= regexp_count(t.error, ',')) as OdciNumberList)) levels ;</code>
手順:
select level from dual connect by level <= regexp_count(t.error, ',')
は、文字列内のカンマの数に 1 を加えたもの (つまり、エラーの数) に等しい一連の数値を生成します。 table()
関数と cast()
関数は、階層クエリを数値リストのコレクションに変換し、次にテーブルに変換します。これにより、TEMP テーブルの各行に対応する番号が増加する行が生成されます。 regexp_substr()
関数は、前のステップの数値に基づいて単一のエラー値を抽出するために使用されます。 trim()
関数は、先頭または末尾の空白を削除します。 注: このソリューションは OdciNumberList タイプを使用しており、12c より前の Oracle バージョンを使用している場合は互換性設定を指定する必要がある場合があります。
以上がOracle でカンマ区切りの文字列を複数の行に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。