Por ejemplo, asumamos que recibimos una cadena como la siguiente:
'SMITH,ALLEN,WARD,JONES'
Ahora, necesitamos tomar esa cadena y utilizarla en la clausula IN de otro SELECT, y obtener la salida..
SQL> select * from emp where ename in ('SMITH,ALLEN,WARD,JONES');
no rows selected
Claramente, no es la salida esperada, necesitamos que la consulta retorne 4 filas.
Esto puede ser logrado, dividiendo la cadena separada por comas en cadenas individuales y pasarlas a la clausula IN.
Por suerte, Oracle proporciona la función regexp_substr, la cual llega a ser útil en este escenario.
Primero, formaremos una consulta, que divide esta cadena separada por comas y convierte a las cadenas individuales en filas.
SQL> select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
2 connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;
REGEXP_SUBSTR('SMITH,A
----------------------
SMITH
ALLEN
WARD
JONES
La anterior consulta, realiza una iteración a través de la cadena separada por comas, buscando la coma, y divide la cadena, tratando a la coma como un delimitador. Retorna la cadena individual como una fila, donde sea que encuentre un delimitador.
Podemos pasar esta consulta a nuestra sentencia SELECT para obtener la salida deseada.
SQL> select * from emp where ename in (
2 select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
3 connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
Ahora, la consulta retorna los resultados deseados.
ORIGINAL de Blogs Oracle
0 Comentarios