Wenn ich gut verstehe, müssen Sie nicht einfach "," durch ein Leerzeichen ersetzen, sondern auch Duplikate auf eine intelligentere Weise entfernen.
Wenn ich diesen Ausdruck ändern mit dem Raum zu arbeiten, anstatt ‚‘ ich
select regexp_replace('A B A A C D' ,'([^ ]+)([ ]*\1)+', '\1') from dual
erhalten, die 'A B A C D'
gibt, nicht das, was Sie brauchen.
Ein Weg, um Ihr gewünschtes Ergebnis bekommen könnte die folgende, etwas komplizierter sein:
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 nicht in der Lage bin einen regexp zu bauen, die für nicht benachbarte Dubletten überprüft, Daher 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 Zeichen in dem Ergebnis-String nichts ausmachen, 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
)
Ich musste nicht lange warten. :-) Allerdings ist die einzige Verbesserung in der äußeren Abfrage - benutze nur die Zeilen mit rn = 1. Das ist die einzige Vereinfachung, die in diesem Fall möglich ist. – mathguy
@mathguy - Ich hatte das Gefühl, ich hatte zu viel Verschachtelung ... :) Immer noch zu denken, wenn einige Regexp Kombination könnte Splitting zu vermeiden, aber nicht zu viel Hoffnung ... – Aleksej
Mit einer langen Auswahl Nesting wird ein Hit sein. Trotzdem kann ich die Bearbeitungszeit gegenüber der korrekten Lösung opfern. Danke –