Si j'ai bien compris, vous n'avez pas simplement besoin de remplacer ',' par un espace, mais également de supprimer les doublons de manière plus intelligente.
Si je modifie cette expression pour travailler avec un espace au lieu de ',', j'obtiens
select regexp_replace('A B A A C D' ,'([^ ]+)( [ ]*\1)+', '\1') from dual
ce qui donne 'A B A C D'
, pas ce dont vous avez besoin.
Un moyen d'obtenir le résultat souhaité pourrait être le suivant, un peu plus compliqué :
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
)
)
Mon principal problème ici est que je ne suis pas en mesure de créer une expression rationnelle qui vérifie les doublons non adjacents, donc je dois diviser la chaîne, vérifier les doublons, puis agréger à nouveau les valeurs non dupliquées, en gardant l'ordre.
Si l'ordre des jetons dans la chaîne de résultat ne vous dérange pas, cela peut être simplifié :
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
)