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

文字列をいくつかの行に分割します

    コメントから@PrzemyslawKruglejの回答まで

    主な問題は、connect byを使用した内部クエリにあります 、驚くべき量の行を生成します

    生成される行の量は、次のアプローチで減らすことができます。

    /* test table populated with sample data from your question */
    SQL> create table t1(str) as(
      2    select 'a;b;c'  from dual union all
      3    select 'b;c;d'  from dual union all
      4    select 'a;c;d'  from dual
      5  );
    Table created
    
    --  number of rows generated will solely depend on the most longest 
    --  string. 
    --  If (say) the longest string contains 3 words (wont count separator `;`)
    --  and we have 100 rows in our table, then we will end up with 300 rows 
    --  for further processing , no more.
    with occurrence(ocr) as( 
      select level 
        from ( select max(regexp_count(str, '[^;]+')) as mx_t
                 from t1 ) t
        connect by level <= mx_t 
    )
    select count(regexp_substr(t1.str, '[^;]+', 1, o.ocr)) as generated_for_3_rows
      from t1
     cross join occurrence o;
    

    結果:最長の行が3つの単語で構成されている3つの行の場合、9つの行が生成されます

    GENERATED_FOR_3_ROWS
    --------------------
                      9
    

    最終クエリ:

    with occurrence(ocr) as( 
      select level 
        from ( select max(regexp_count(str, '[^;]+')) as mx_t
                 from t1 ) t
        connect by level <= mx_t 
    )
    select res
         , count(res) as cnt
      from (select regexp_substr(t1.str, '[^;]+', 1, o.ocr) as res
              from t1
             cross join occurrence o)
     where res is not null
     group by res
     order by res;
    

    結果:

    RES          CNT
    ----- ----------
    a              2
    b              2
    c              3
    d              2
    

    SQLFIddleデモ

    regexp_count()(11g以上)およびregexp_substr()正規表現関数の詳細をご覧ください。

    注: 正規表現関数の計算には比較的コストがかかります。非常に大量のデータを処理する場合は、プレーンなPL/SQLへの切り替えを検討する価値があります。これが例です。



    1. エイリアスによるグループ化(Oracle)

    2. select SCOPE_IDENTITY()が整数ではなく小数を返すのはなぜですか?

    3. データベースの専門家にとって機械学習が意味すること

    4. エラー「ORA-01790:式は対応する式と同じデータ型である必要があります」を修正しました