sql >> Database teknologi >  >> RDS >> Oracle

Hvordan fjerner du dubletter fra mellemrumssepareret liste af Oracle regexp_replace?

Hvis jeg forstår det godt, skal du ikke bare erstatte ',' med et mellemrum, men også fjerne dubletter på en smartere måde.

Hvis jeg ændrer det udtryk til at arbejde med mellemrum i stedet for ',', får jeg

select regexp_replace('A B A A C D' ,'([^ ]+)( [ ]*\1)+', '\1') from dual

som giver 'A B A C D' , ikke hvad du har brug for.

En måde at få dit ønskede resultat på kunne være følgende, lidt mere kompliceret:

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
                )
         )

Mit største problem her er, at jeg ikke er i stand til at bygge et regexp, der kontrollerer for ikke-tilstødende dubletter, så jeg er nødt til at opdele strengen, tjekke for dubletter og derefter aggregere de ikke-duplikerede værdier igen, og holde rækkefølgen.

Hvis du ikke har noget imod rækkefølgen af ​​tokens i resultatstrengen, kan dette forenkles:

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
     )


  1. Pivottabel med ikke-kardinalværdier

  2. LOBBEHOLDELSE

  3. Salesforce API-forespørgselsmarkørgrænser

  4. Aggreger funktion over et givet tidsinterval