私がよく理解している場合は、単に「、」をスペースに置き換えるだけでなく、よりスマートな方法で重複を削除する必要があります。
'、'の代わりにスペースで機能するようにその式を変更すると、次のようになります
select regexp_replace('A B A A C D' ,'([^ ]+)( [ ]*\1)+', '\1') from dual
'A B A C D'
を与えます 、必要なものではありません。
必要な結果を得る方法は、次のようになりますが、もう少し複雑です。
with string(s) as ( select 'A B A A C D' from dual)
select listagg(case when rn = 1 then str end, ' ') within group (order by lev)
from (
select str, row_number() over (partition by str order by 1) rn, lev
from (
SELECT trim(regexp_substr(s, '[^ ]+', 1, level)) str,
level as lev
FROM string
CONNECT BY instr(s, ' ', 1, level - 1) > 0
)
)
ここでの私の主な問題は、隣接していない重複をチェックする正規表現を作成できないことです。そのため、文字列を分割し、重複をチェックしてから、重複していない値を並べ替えて集計する必要があります。
結果文字列内のトークンの順序を気にしない場合は、これを簡略化できます。
with string(s) as ( select 'A B A A C D' from dual)
select listagg(str, ' ') within group (order by 1)
from (
SELECT distinct trim(regexp_substr(s, '[^ ]+', 1, level)) as str
FROM string
CONNECT BY instr(s, ' ', 1, level - 1) > 0
)