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

Oracleのおよび:区切り文字を使用してCLOBオブジェクトを複数のレコードに分割する方法

    再帰的因数分解サブクエリ(Oracle 11.2以降)を使用したソリューションは次のとおりです。

    with inputs ( str ) as (
           select to_clob('ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0')
           from dual
         ),
         prep ( s, n, token, st_pos, end_pos ) as (
           select ',' || str || ',', -1, null, null, 1
             from inputs
           union all
           select s, n+1, substr(s, st_pos, end_pos - st_pos),
                  end_pos + 1, instr(s, ',', 1, n+3)
             from prep
             where end_pos != 0
         )
    select n as idx, token as column_name
    from   prep
    where  n > 0;
    
    
    
       IDX COLUMN_NAME
    ------ ----------------------------
         1 ABCDEF:PmId12345RmLn1VlId0
         2 ABCDEF:PmId12345RmLn1VlId0
         3 ABCDEF:PmId12345RmLn1VlId0
         4 ABCDEF:PmId12345RmLn1VlId0
         5 ABCDEF:PmId12345RmLn1VlId0
    

    メモ

    あなたはCLOBと言いましたが、あなたの例ではvarchar2文字列から抽出しました。 to_clob()を追加しました これがCLOBで機能するかどうか/どのように機能するかを確認します。

    instrを使用しました およびsubstr 、多くの場合(通常は?)、regexpよりもパフォーマンスが優れています。 同等のもの。

    各サブストリングの「インデックス」を入力ストリング内に保存しました。場合によっては、入力文字列内のトークンの順序が重要になります。 (ただし、あなたの例ではありませんが、同じトークンを5回繰り返しただけです。)

    より良いパフォーマンスが必要な場合、特にCLOBが非常に大きい場合は、dbms_lob.substrを使用した方がよい場合があります。 およびdbms_lob.instr -CLOBでのSUBSTRのパフォーマンス を参照してください 、特にAlex Pooleの回答、およびここにあるドキュメント: http ://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD 。構文の違いと通常のsubstrに注意してください / instr



    1. mysqlデータを使用した高低価格での並べ替え

    2. Oracle DBに接続するときに、ネットワークアダプタが接続を確立できませんでした

    3. SQL ServerでのOBJECTPROPERTYEX()のしくみ

    4. テーブル変数のパフォーマンスを修正するための新しいトレースフラグ