Solución:
El “abuso” (como lo expresó 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 de la cadena que no contenga una coma.
Si intenta ejecutar:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token"
FROM DUAL
obtendrás 23
.
y si intentas ejecutar:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM DUAL
también obtendrás 23
solo que ahora también ponemos dos parámetros adicionales: comience a buscar en la posición 1 (que es la predeterminada) y devuelva la primera aparición.
Ahora ejecutemos:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM DUAL
esta vez tendremos 34
(Segunda aparición) y usando 3
como volverá el último parámetro 45
etcétera.
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
volverá:
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 tu violín con él, podría darle una visión más clara del tema.
connect by
no tiene nada que ver con regex_substr
:
-
La primera es realizar una consulta jerárquica, consulte http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm
-
El segundo es obtener una subcadena usando expresiones regulares.
Esta consulta “abusa” del connect by
funcionalidad para generar filas en una consulta en dual
. Mientras la expresión pasara a connect by
es cierto, generará una nueva fila y aumentará el valor de la pseudocolumna LEVEL
.
Luego LEVEL
se pasa a regex_substr
para obtener el enésimo valor al aplicar la expresión regular.