Děkuji těm, kteří odpověděli. Po prostudování vašich odpovědí a odpovědí v dodaném odkazu jsem dospěl k tomuto řešení:
SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
2 from dual;
Data
----
Což lze popsat jako „podívejte se na 2. výskyt volitelné sady nula nebo více znaků, za kterými následuje čárka nebo konec řádku, a vraťte 1. podskupinu (což jsou data minus čárka nebo konec řádek).
Zapomněl jsem zmínit, že jsem testoval s nulou v různých pozicích, více nulami, výběrem různých pozic atd.
Jedinou námitku, kterou jsem našel, je, že pokud je pole, které hledáte, větší než dostupné číslo, vrátí pouze hodnotu NULL, takže si toho musíte být vědomi. V mém případě to není problém.
EDIT:Aktualizuji přijatou odpověď ve prospěch budoucích hledačů, kteří na to mohou narazit.
Dalším krokem je zapouzdření kódu, aby se z něj dala udělat jednodušší, opakovaně použitelná funkce. Zde je zdroj funkce:
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;
To skryje složitost regulárních výrazů před vývojáři, kteří s tím nemusí být tak spokojeni, a stejně tak je kód při používání čistší. Nazvěte to takto, abyste získali 4. prvek:
select get_list_element('123,222,,432,555', 4) from dual;