Regexp_substr funguje takto:
Pokud je výskyt větší než 1, pak databáze hledá druhý výskyt začínající prvním znakem následujícím po prvním výskytu vzoru , a tak dále. Toto chování se liší od funkce SUBSTR, která začíná hledat druhý výskyt u druhého znaku prvního výskytu.
Vzor [^|] tedy bude hledat NON potrubí, což znamená, že přeskočí po sobě jdoucí potrubí ("||") hledající znak bez potrubí.
Můžete zkusit:
select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;
Toto nahradí "|" s "| " a umožní vám porovnat na základě vzoru [^|]