DECODE, CASE y NULL’s

Los más viejos del lugar estamos acostumbrados a trabajar con la útil función DECODE. La hemos venido utilizando profusamente a lo largo de los años, pero (no tan) recientemente Oracle introdujo su ‘prima’ CASE. CASE es una construcción de tipo IF…THEN…ELSIF…THEN…ELSE… que se puede utilizar dentro de las sentencias SQL y que amplía las funcionalidades de DECODE. En muchos foros se anima a la transición de ir sustituyendo poco a poco los DECODEs por CASEs. Principalmente porque:

·CASE pertenece al estándar, mientras que DECODE es sintaxis propia de Oracle.
·CASE es más flexible, ya que tiene dos modos de funcionamiento: ’simple’ (simple) y ‘búsqueda’ (search).

El modo ’simple’ es muy parecido al DECODE de toda la vida, pero hay una sutil diferencia que puede llegar a no ser tan sutil:

SQL> SELECT DECODE(NULL,
2                  NULL, 'NULL Es Nulo',
3                 'NULL No Es Nulo') NULL_DECODE,
4  CASE NULL
5       WHEN NULL THEN 'NULL Es Nulo'
6       ELSE 'NULL No Es Nulo'
7  END NULL_CASE
8  FROM DUAL;

NULL_DECODE  NULL_CASE
------------ ---------------
NULL Es Nulo NULL No Es Nulo

En efecto, el tratamiento que se hace de los valores nulos es diferente. DECODE en este aspecto se sale un poco del estándar de la lógica trivaluada en operaciones con nulos (NULL = NULL ? => TRUE) mientras que CASE sí la sigue a rajatabla (NULL = NULL ? => NULL).

Así que NULL y DECODE no son intercambiables en todos los casos.

Gracias a CarlosAL