De regexp_substr werkt als volgt:
Als het voorkomen groter is dan 1, dan zoekt de database naar het tweede voorkomen, beginnend met het eerste teken dat volgt op het eerste voorkomen van het patroon , enzovoorts. Dit gedrag wijkt af van de SUBSTR-functie, die begint te zoeken naar het tweede voorkomen bij het tweede teken van het eerste voorkomen.
Dus het patroon [^|] zoekt naar NIET-pijpen, wat betekent dat het opeenvolgende pijpen ("||") zal overslaan op zoek naar een niet-pijpteken.
Je zou kunnen proberen:
select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;
Dit vervangt een "|" met een "| " en u kunt matchen op basis van het patroon [^|]