Der regexp_substr funktioniert so:
Wenn das Vorkommen größer als 1 ist, sucht die Datenbank nach dem zweiten Vorkommen, beginnend mit dem ersten Zeichen nach dem ersten Vorkommen von Muster , und so weiter. Dieses Verhalten unterscheidet sich von der SUBSTR-Funktion, die ihre Suche nach dem zweiten Vorkommen beim zweiten Zeichen des ersten Vorkommens beginnt.
Das Muster [^|] sucht also nach NICHT-Pipes, was bedeutet, dass es aufeinanderfolgende Pipes ("||") überspringt und nach einem Nicht-Pipe-Zeichen sucht.
Sie könnten Folgendes versuchen:
select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;
Dies ersetzt ein "|" mit einem "| " und ermöglichen Ihnen den Abgleich nach dem Muster [^|]