Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment supprimer les doublons de la liste séparée par des espaces par Oracle regexp_replace ?

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
     )