Como pasar una cadena separada por comas a la clausula IN de un SELECT [Oracle]

En algunos casos, recibimos una cadena separada por comas, tal vez de otro SELECT o un parámetro, que deberíamos pasar a la clausula IN de una sentencia SELECT.

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

Comentarios