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:

system@TEST10G> 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 (aunque sí en casi todos).

Saludos.

Carlos.

7 respuestas a DECODE, CASE y NULL’s

  1. Edward dice:

    Amigos, necesito ayuda, estoy creando una vista con if then else dentro la vista y no funciona. Como hago para que funcione o existe otra alternativa??

    Saludos

    Edward

  2. pedro dice:

    Gracias por las indicaciones, me ayudó mucho en unos ejercicios que estoy preparando. Es muy curioso que dos herramientas a priori equivalentes se comporten diferente

  3. Erik dice:

    La diferencia en tiempos de ejecución como anda si comparamos DECODE con CASE ??

  4. daniel dice:

    > SELECT DECODE(NULL,
    NULL, ‘NULL = Nulo’,
    ‘NULL No Es = Nulo’) NULL_DECODE,
    CASE WHEN NULL IS NULL THEN ‘NULL Es Nulo’
    ELSE ‘NULL No Es Nulo’
    END NULL_CASE
    FROM DUAL;

    NULL_DECODE NULL_CASE
    ———– —————
    NULL = Nulo NULL Es Nulo
    🙂
    (gracias!)

  5. Carlos dice:

    –CASE MAL HECHO CON NULOS
    SELECT DECODE(NULL,
    NULL, ‘NULL Es Nulo’,
    ‘NULL No Es Nulo’) NULL_DECODE,
    CASE NULL
    WHEN NULL
    THEN
    ‘NULL Es Nulo’
    ELSE
    ‘NULL No Es Nulo’
    END NULL_CASE
    FROM DUAL;

    –CASE BIEN HECHO CON NULOS
    SELECT DECODE(NULL,
    NULL, ‘NULL Es Nulo’,
    ‘NULL No Es Nulo’) NULL_DECODE,
    CASE WHEN (NULL IS NULL)
    THEN
    ‘NULL Es Nulo’
    ELSE
    ‘NULL No Es Nulo’
    END NULL_CASE
    FROM DUAL;

    El case es como si te añadiese un = despues de la expresión por lo que en el primer caso oracle intentaría traducirlo como null = null. Por eso para evaluar el nulo devemos de poner la expresion completa (NULL IS NULL) .

  6. CarlosAL dice:

    A los dos últimos comentarios:

    No se trataba de explicar cómo se hace ‘bien’ o ‘mal’, se trataba de explicar las diferencias que existen cuando utilizamos el modo SIMPLE del CASE (sin WHEN, que es el modo ‘search’) comparado con DECODE().

    Si leéis detenidamente el texto veréis que dice:
    “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”

    Saludos.

    Carlos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: