Regexp_substr работи по следния начин:
Ако срещането е по-голямо от 1, тогава базата данни търси това второ срещане, започвайки с първия знак след първото появяване на шаблон , и т.н. Това поведение е различно от функцията SUBSTR, която започва търсенето на второто появяване при втория знак на първото появяване.
Така че шаблонът [^|] ще търси НЕ тръби, което означава, че ще пропусне последователни тръби ("||"), търсейки не-тръбен char.
Може да опитате:
select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;
Това ще замени "|" с "| " и ви позволява да съпоставяте въз основа на шаблона [^|]