Grazie a chi ha risposto. Dopo aver esaminato le tue risposte e le risposte nel link fornito, sono arrivato a questa soluzione:
SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
2 from dual;
Data
----
Che può essere descritto come "guarda la 2a occorrenza di un insieme facoltativo di zero o più caratteri seguiti da una virgola o dalla fine della riga, e restituisce il 1o sottogruppo (che sono i dati meno la virgola o la fine del riga).
Ho dimenticato di dire che ho testato con il null in varie posizioni, più null, selezionando varie posizioni, ecc.
L'unico avvertimento che potrei trovare è che se il campo che cerchi è maggiore del numero disponibile, restituisce semplicemente NULL, quindi devi esserne consapevole. Nessun problema per il mio caso.
EDIT:sto aggiornando la risposta accettata a beneficio dei futuri ricercatori che potrebbero imbattersi in questo.
Il passaggio successivo consiste nell'incapsulare il codice in modo che possa essere trasformato in una funzione più semplice e riutilizzabile. Ecco la fonte della funzione:
FUNCTION GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
BEGIN
RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1);
END GET_LIST_ELEMENT;
Ciò nasconde le complessità delle espressioni regolari agli sviluppatori che potrebbero non essere così a proprio agio con esso e rende comunque il codice più pulito quando è in uso. Chiamalo in questo modo per ottenere il 4° elemento:
select get_list_element('123,222,,432,555', 4) from dual;