COALESCE, ISNULL y NULLIF: trabajar con valores ausentes

Un valor NULL representa información desconocida o no disponible. No equivale a cero ni a una cadena vacía, y puede propagarse a través de expresiones que parecían sencillas.

COALESCE, ISNULL y NULLIF ayudan a tratar esos casos, pero no realizan exactamente el mismo trabajo.

La idea

  • COALESCE devuelve el primer valor que no sea NULL dentro de una lista.
  • ISNULL sustituye un valor NULL por una alternativa.
  • NULLIF devuelve NULL cuando sus dos expresiones son iguales; de lo contrario devuelve la primera.

Sintaxis

COALESCE(Expresion1, Expresion2, Expresion3)

ISNULL(Expresion, ValorAlternativo)

NULLIF(Expresion1, Expresion2)

Ejemplo: elegir el primer teléfono disponible

Queremos mostrar primero el teléfono móvil. Si no existe o contiene solo espacios, utilizaremos el teléfono de casa:

SELECT
    c.IdCliente,
    c.Nombre,
    COALESCE(
        NULLIF(TRIM(c.TelefonoMovil), ''),
        NULLIF(TRIM(c.TelefonoCasa), ''),
        'Sin teléfono'
    ) AS TelefonoContacto
FROM dbo.Cliente AS c
ORDER BY c.IdCliente;
Nombre TelefonoContacto
Ana Torres 7710001001
Bruno Díaz 7710001002
Carla Ruiz Sin teléfono
Elena Mora 7710001005

NULLIF convierte la cadena vacía en NULL. Después COALESCE avanza hasta encontrar el primer valor disponible.

Sustituir un solo valor

Cuando solo existe una alternativa, ISNULL resulta directo:

SELECT
    c.Nombre,
    ISNULL(c.Correo, 'Sin correo') AS Correo
FROM dbo.Cliente AS c;

En SQL Server, el tipo y la longitud del resultado de ISNULL dependen principalmente de su primer argumento. COALESCE sigue las reglas de precedencia de tipos entre todas sus expresiones. La diferencia puede importar cuando combinamos textos de longitudes distintas o tipos numéricos.

Evitar una división entre cero

NULLIF puede convertir un divisor igual a cero en NULL:

DECLARE @Importe DECIMAL(12, 2) = 850.00;
DECLARE @Unidades INT = 0;

SELECT @Importe / NULLIF(@Unidades, 0) AS ImportePorUnidad;

DECLARE crea las variables locales utilizadas por el ejemplo; su sintaxis completa aparece en la ficha sobre variables.

El resultado será NULL en lugar de producir un error por división entre cero. Si necesitamos mostrar cero u otro valor, podemos envolver la expresión con COALESCE:

SELECT COALESCE(@Importe / NULLIF(@Unidades, 0), 0) AS ImportePorUnidad;

Qué conviene comprobar

Sustituir un nulo no corrige por sí mismo la calidad de los datos. Una cadena vacía, una cadena con espacios y un valor NULL son estados diferentes; por eso el ejemplo utiliza TRIM y NULLIF antes de COALESCE.

También debemos comprobar el tipo resultante. Una alternativa aparentemente inocente puede provocar truncamiento o una conversión implícita si sus tipos no son compatibles con la expresión original.

Relacionado con

  • CASE: permite expresar alternativas con condiciones más amplias.
  • IS NULL: filtra filas cuyo valor es nulo.
  • Funciones de texto: ayudan a distinguir cadenas vacías y espacios.
  • Conversiones: permiten controlar explícitamente el tipo del resultado.