Ambos sirven como control de flujo del tipo IF, ELSE sobre un query, funcionando de la siguiente manera
DECODE
decode(
expresión,
condicional1, valorAAplicar1,
condicional2, valorAAplicar2,
…
valorElse –En caso de que no se cumplan las anteriores
)
Ejemplo (utilizaré la tabla dual para los ejemplos)
select decode( 1,
1,1 –condicional y valor
2 –valor else
)
from dual;
CASE
case expresión
when condicional1 then valorAAplicar1,
when condicional2 then valorAAplicar2
else valorElse–En caso de que no se cumplan los anteriores
end
Ejemplo
select case
when 1 then 1
else 2
end
from dual;
Aparentemente son exactamente lo mismo, tienen la misma funcionalidad, pero en el fondo no es así por dos grandes razones:
1. Con decode, Oracle toma el tipo de dato del primer parámetro y los siguientes parámetros los parsea para que sean del mismo tipo de dato.
Por su parte, case no hace eso, por lo que si tenemos el primer parámetro de tipo number y el segundo varchar2 no hace una conversión y por tanto marca un error.
Sugiero ejecutar las siguientes sentencias para corrobar el punto 1:
select decode(1, 1, 1, ‘3’) from dual;
select case 1
when 1 then 1
else ‘3’ end from dual;
Podrá notarse que en el case, Oracle arrojará el error ORA-00932: inconsistent datatypes: expected NUMBER got CHAR.
2.Decode, en cuanto a performance es más rápido que case.
Ejecutar las siguientes sentencias y verificar el tiempo de ejecución. Decode es más rápido:
select decode(1, 1, 1, 3) from dual;
select case 1
when 1 then 1
else 3 end from dual;
Como hacer dos condiciones dentro de un DECODE
Quiere que se resuelva la duda del siguiente ejemplo:
Para que se cumplan las dos condiciones de mi DECODE necesito:
Que el CODE sea 'PO'
Que su EQUIV sea igual a 85
REspuesta:
Las comparaciones con decode son uno a uno. Mejor usa una expresión CASE:
CASE
WHEN CODE='PR'
THEN 'El título de '
WHEN CODE='ES'
THEN 'El diploma de '
WHEN CODE='PO' AND EQUIV = 85
THEN 'con 85’
END
Con CASE anidado:
CASE CODE
WHEN 'PR' THEN 'El título de '
WHEN 'ES' THEN 'El diploma de '
WHEN 'PO' THEN CASE EQUIV
WHEN 85 THEN 'con 85'
ELSE 'sin 85'
END
END
Similarmente puedes anidar decode:
decode( CODE
, 'PR', 'El título de '
, 'ES', 'El diploma de '
, 'PO', decode( EQUIV
, 85, 'con 85'
, 'sin 85'
)
)
O cualquier combinación de las anteriores.
Fuentes.
Artículo: "Decode y CASE" Publicado en https://carminaplsql.wordpress.com/ por CARMINAANGELESB el 25 DICIEMBRE, 2015. Consultado el 17/11/2023.
URL: https://carminaplsql.wordpress.com/2015/12/25/decode-y-case/
Artículo: "Como hacer dos condiciones dentro de un DECODE" Publicado en https://es.stackoverflow.com/ el 30 enero, 2020. Consultado el 17/11/2023.
URL: https://es.stackoverflow.com/questions/325311/como-hacer-dos-condiciones-dentro-de-un-decode
No hay comentarios:
Publicar un comentario