Riffing off tuto metodu pro rozdělení řetězce s povolením null:
select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, level, null, 1) from dual
connect by level < regexp_count('A~^B~^C~D^E','(.*?)(~\^|$)');
REGEXP_SUBS
-----------
A
B
C~D^E
Stejně jako v propojené odpovědi hledá všechny znaky, nenásytně, následované kombinací ~^ (s stříškou escapovanou, takže ~\^ ) nebo konec řádku. regexp_substr() volání také používá volitelné argumenty k určení subexpr - takže získá pouze první seskupení (.*? ) a nikoli samotný oddělovač, který je ve druhé skupině.
Pokud chcete konkrétní prvek, pak je to ještě blíže odkazovanému příspěvku:
select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, 3, null, 1) from dual;
REGEX
-----
C~D^E
Nebo když to děláte v proceduře, použijte dotaz typu connect-by k naplnění kolekce a poté vyberte prvek, který potřebujete, pokud se budete dívat na více než jeden.