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

Oracleのコンマ区切り文字列から特定の値を削除する方法

    これは、(正規表現ではなく)標準の文字列関数のみを使用するソリューションです。これにより、ほとんどの場合、実行が高速化されます。 3は、最初の文字の後にコンマが続く場合、最後の文字がコンマの前にある場合、または前後にコンマが続く場合にのみ削除されます。また、大文字と小文字の前後のコンマが削除され、その後のコンマが削除されます。 1番目と3番目のケース。

    連続するコンマ(おそらくNULLの代わりになります)を残したまま、2つの3を続けて削除でき(提供されている他のソリューションの一部では実行できません)、38や123などの数字を邪魔しません。

    戦略は、最初にすべてのコンマを2倍にすることです(,を置き換えます) ,,を使用 )およびコンマを追加および追加します(文字列の最初と最後に)。次に、出現するすべての,3,を削除します 。残っているものから、すべての,,を置き換えます 単一の,で戻る 最後に、先頭と末尾の,を削除します 。

    with
         test_data ( str ) as (
           select '1,2,3,4,5'     from dual union all
           select '1,2,3,3,4,4,5' from dual union all
           select '12,34,5'       from dual union all
           select '1,,,3,3,3,4'   from dual
         )
    select str,
           trim(both ',' from 
                 replace( replace(',' || replace(str, ',', ',,') || ',', ',3,'), ',,', ',')
               ) as new_str
    from   test_data
    ;
    
    STR           NEW_STR
    ------------- ----------
    1,2,3,4,5     1,2,4,5
    1,2,3,3,4,4,5 1,2,4,4,5
    12,34,5       12,34,5
    1,,,3,3,3,4   1,,,4
    
    4 rows selected.
    

    MT0(以下のコメントを参照)で指摘されているように、元の文字列がコンマで開始または終了する場合、これはトリミングしすぎます。その場合をカバーするために、trim(both ',' from ...)内ですべてをラップする代わりに 残りをサブクエリでラップし、substr(new_str, 2, length(new_str) - 2)のようなものを使用する必要があります 外側のクエリで。



    1. MySQLデータベース値をPHP変数に割り当てます

    2. ORACLEでのトリッキーなGROUPBYの問題

    3. Oracle String to Date 2013-10-15T20:12:56.24584 + 0100

    4. OracleSQLを使用した論理ネッティングを使用したロールアップクエリ