これは、(正規表現ではなく)標準の文字列関数のみを使用するソリューションです。これにより、ほとんどの場合、実行が高速化されます。 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)
のようなものを使用する必要があります 外側のクエリで。