Solución error clausula CASE en Oracle


Cuando trabajamos con ORACLE (en el resto de SGBD no ocurre) y la consulta que utilizamos para obtener los datos de nuestro control contiene clausulas "Complejas" como por ejemplo sub selects o clausulas "CASE" en el Group By, en el momento de generar columnas se produce un error.


Problema

Por ejemplo, si tenemos esta consulta a interrogar a una base de datos oracle:
select DEPARTMENT_ID as "IDDepartamento"
, CASE WHEN HIRE_DATE < '01/01/2010' THEN 'veterano' ELSE 'novel' END as "Antiguedad"
, SUM(SALARY) as "Salario"
from EMPLOYEES
GROUP BY DEPARTMENT_ID
, CASE WHEN HIRE_DATE < '01/01/1990' THEN 'veterano' ELSE 'novel' END

podemos apreciar que no hay ningún error de sintaxis y, de hecho, la consulta se ejecuta correctamente, sin embargo cuando pedimos Generar Columnas aparece el siguiente error.


Esta situación se repite siempre que se consulta la estructura de datos resultante de la ejecución de las queries, por ejemplo al generar las columnas o seleccionar columnas para cálculos periódicos, joins in memory, etc...

De hecho, el error se produce cuando se intenta generar el esquema de la tabla resultante utilizando las apis de generación de esquema de Oracle.

Solución

La solución a este error pasa simplemente por poner paréntesis en la clausula CASE del SELECT, tal y como se muestra a continuación:
select DEPARTMENT_ID as "IDDepartamento"
, (CASE WHEN HIRE_DATE < '01/01/2010' THEN 'veterano' ELSE 'novel' END) as "Antiguedad"
, SUM(SALARY) as "Salario"
from EMPLOYEES
GROUP BY DEPARTMENT_ID
, (CASE WHEN HIRE_DATE < '01/01/1990' THEN 'veterano' ELSE 'novel' END)

De esta manera tan simple el driver de Oracle es capaz de analizar el esquema resultante y conseguimos solucionar un problema reportado en algunas ocasiones.

0 comentarios :

Publicar un comentario

Lo más visto