Regexp_substr fungerer på denne måde:
Hvis forekomsten er større end 1, så søger databasen efter denne anden forekomst begyndende med det første tegn efter den første forekomst af mønsteret , og så videre. Denne adfærd er forskellig fra funktionen SUBSTR, som begynder sin søgning efter den anden forekomst ved det andet tegn i den første forekomst.
Så mønsteret [^|] vil lede efter IKKE-rør, hvilket betyder, at det vil springe på hinanden følgende rør over ("||") på udkig efter en ikke-rørkul.
Du kan prøve:
select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;
Dette vil erstatte et "|" med et "| " og giver dig mulighed for at matche baseret på mønsteret [^|]