Riffare questo metodo per dividere una stringa consentendo valori 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
Come nella risposta collegata, cerca qualsiasi carattere, non avidamente, seguito dalla combinazione di ~^ (con l'accento circonflesso, quindi ~\^ ) o fine linea. Il regexp_substr() chiama anche gli argomenti facoltativi per specificare subexpr - quindi ottiene solo il primo raggruppamento (.*? ) e non il delimitatore stesso, che si trova nel secondo raggruppamento.
Se vuoi un elemento specifico, è ancora più vicino al post collegato:
select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, 3, null, 1) from dual;
REGEX
-----
C~D^E
Oppure, mentre esegui questa operazione in una procedura, utilizza la query di connessione per popolare una raccolta, quindi scegli l'elemento di cui hai bisogno, se ne vedrai più di uno.