Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie entferne ich Duplikate aus der durch Leerzeichen getrennten Liste von Oracle regexp_replace?

Wenn ich es richtig verstanden habe, müssen Sie nicht nur ',' durch ein Leerzeichen ersetzen, sondern auch Duplikate auf intelligentere Weise entfernen.

Wenn ich diesen Ausdruck so ändere, dass er mit Leerzeichen statt ',' arbeitet, bekomme ich

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

was 'A B A C D' ergibt , nicht das, was Sie brauchen.

Ein etwas komplizierterer Weg, um das benötigte Ergebnis zu erhalten, könnte folgendermaßen aussehen:

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

Mein Hauptproblem hier ist, dass ich keinen regulären Ausdruck erstellen kann, der nach nicht benachbarten Duplikaten sucht, also muss ich die Zeichenfolge aufteilen, nach Duplikaten suchen und dann die nicht duplizierten Werte erneut aggregieren, wobei die Reihenfolge beibehalten wird.

Wenn Sie die Reihenfolge der Tokens in der Ergebniszeichenfolge nicht stört, kann dies vereinfacht werden:

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
     )