El "abuso" (como dijo Colin 't Hart) de connected by tiene un buen propósito aquí:usando REGEXP_SUBSTR puede extraer solo una de las 4 coincidencias (23,34,45,56):la expresión regular [^,]+ coincide con cualquier secuencia de caracteres en la cadena que no contenga una coma.
Si intentará ejecutar:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token"
FROM DUAL
obtendrás 23 .
y si intentará ejecutar:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM DUAL
también obtendrás 23 solo que ahora también establecemos dos parámetros adicionales :comience a buscar en la posición 1 (que es la predeterminada) y devuelva la primera aparición.
Ahora vamos a ejecutar:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM DUAL
esta vez obtendremos 34 (segunda aparición) y usando 3 como último parámetro devolverá 45 y así sucesivamente.
El uso de recursivo connected by junto con level se asegura de que recibirá todos los resultados relevantes (¡aunque no necesariamente en el orden original!):
SELECT DISTINCT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) as "token"
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) IS NOT NULL
order by 1
devolverá:
TOKEN
23
34
45
56
que no solo contiene los 4 resultados, sino que también los divide en filas separadas en el conjunto de resultados.
Si vas a jugar con él - podría darle una visión más clara del tema.