sql >> データベース >  >> RDS >> Oracle

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

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

    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, '[^,]+')) + 1 regexp_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)) オラクルタイプのキャストを行います。
      • 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_valueを使用します nth_appearance / ocurrenceとして regexp_substrのパラメーター 。
    6. データセットから他の列を追加できます(t.name, t.project 例として)簡単に視覚化できます。

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

    • REGEXP_REPLACE
    • REGEXP_SUBSTR
    • 拡張性の定数、タイプ、およびマッピング(OdciNumberList)
    • CAST(マルチセット)
    • 階層クエリ


    1. SQL Serverの高可用性:既存のフェールオーバークラスターインスタンスに新しいディスクを追加します

    2. @JoinColumnとは何ですか?Hibernateでの使用方法

    3. OracleのREGEXP_INSTR()関数

    4. コマンドラインからcsvをmysqlにインポートする