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.