viernes, 1 de diciembre de 2023

Uso de Decode y CASE en consultas

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