NULL significa “sin valor”: no es un cero ni un texto vacío. Esto tiene consecuencias que sorprenden al principio: cualquier operación con un NULL da NULL, y en un listado aparece una celda vacía donde quizá esperabas un número. COALESCE resuelve los dos problemas.

Sintaxis
COALESCE(valor1, valor2, ..., valorN)

Devuelve el primer valor de la lista que no sea NULL. Si todos lo son, devuelve NULL.

Sustituir un NULL por un valor

El cliente Ignacio no tiene cuenta registrada. Con COALESCE podemos mostrar un texto en su lugar. Como cuenta es un número y el texto no, primero convertimos la cuenta a texto con CAST, porque todos los valores de COALESCE deben ser del mismo tipo:

PostgreSQL en tu navegador · Ctrl+Enter para ejecutar · los cambios se deshacen al terminar
nombre apellidos cuenta
Fernando García Rodriguez 111222333
María Lopez ruiz 123456789
Ana Fernandez Montero 998344567
Luis Sanchez García 447824556
Alejandro Valero Martinez 778345112
Paloma Sanz Valdivia 790763467
Ignacio Herrero Dominguez Sin cuenta

Evitar que un NULL estropee un cálculo

El pedido del Horno Balay no tiene cliente asignado. Si hacemos un LEFT JOIN desde Clientes y sumamos, los clientes sin pedidos salen con NULL en lugar de 0:

PostgreSQL en tu navegador · Ctrl+Enter para ejecutar · los cambios se deshacen al terminar
nombre sinCoalesce conCoalesce
Fernando 2449,50 2449,50
María 3199,78 3199,78
Ana 4304,25 4304,25
Luis 4999,00 4999,00
Alejandro 899,97 899,97
Paloma NULL 0
Ignacio NULL 0

Paloma e Ignacio no tienen pedidos: SUM no tiene nada que sumar y devuelve NULL. Con COALESCE(..., 0) el informe muestra un 0, que es lo que se espera leer.

Varios valores de reserva

La ventaja de COALESCE frente a otras funciones es que admite cualquier número de argumentos y se queda con el primero disponible. Es útil, por ejemplo, para elegir el mejor dato de contacto entre varias columnas:

SELECT nombre,
       COALESCE(telefonoMovil, telefonoFijo, email, 'Sin contacto') AS contacto
FROM Clientes;

COALESCE frente a ISNULL

SQL Server tiene también ISNULL(valor, sustituto), que hace lo mismo con dos argumentos. Las diferencias importan:

COALESCE ISNULL
Estándar SQL Sí, funciona en cualquier base de datos No, solo SQL Server
Número de argumentos Dos o más Exactamente dos
Tipo del resultado El de mayor precedencia entre los argumentos El del primer argumento

La última fila es la que más errores provoca. ISNULL convierte el sustituto al tipo del primer argumento, así que puede recortar un texto sin avisar:

DECLARE @codigo VARCHAR(3) = NULL;

SELECT ISNULL(@codigo, 'Sin código') AS conIsnull,     -- 'Sin'
       COALESCE(@codigo, 'Sin código') AS conCoalesce; -- 'Sin código'

Salvo que trabajes solo con SQL Server y necesites ISNULL por rendimiento en algún caso muy concreto, usa COALESCE.

NULLIF: el camino inverso

NULLIF(a, b) devuelve NULL si los dos valores son iguales y a si no lo son. Su uso clásico es evitar la división entre cero: si el divisor es 0, lo convierte en NULL y el resultado de la división es NULL en lugar de un error.

PostgreSQL en tu navegador · Ctrl+Enter para ejecutar · los cambios se deshacen al terminar
producto totalPrecio numeroProductos precioUnitario
Xiami Mi 11 4304,25 15 286,95
Play Station 5 2199,80 4 549,95
Xbox series X 999,98 2 499,99
MacBook Pro M1 2449,50 1 2449,50
Echo DOT 3 1999,50 50 39,99
Echo DOT 4 2999,50 50 59,99
Nintendo Switch 899,97 3 299,99
Horno Balay 1399,10 2 699,55

Aquí ningún pedido tiene 0 unidades, así que todas las filas tienen precio; prueba a cambiar el 0 de NULLIF por 50 y verás que los dos Echo DOT pasan a NULL. Combinado con COALESCE se puede devolver además un valor por defecto: COALESCE(totalPrecio / NULLIF(numeroProductos, 0), 0).

Errores frecuentes

  • Comparar con = NULL. WHERE cuenta = NULL nunca devuelve filas. Usa IS NULL o IS NOT NULL (lo vimos en operadores).
  • Mezclar tipos. COALESCE(cuenta, 'Sin cuenta') falla porque cuenta es numérica; convierte primero con CAST.
  • Usar COALESCE dentro del WHERE sobre una columna indexada. WHERE COALESCE(cuenta, 0) = 0 impide que el motor use un índice sobre cuenta. Es mejor WHERE cuenta = 0 OR cuenta IS NULL.

Practica

  1. Lista los pedidos mostrando 'Sin cliente' cuando idClientes sea NULL.
  2. ¿Qué devuelve COALESCE(NULL, NULL, 3, 4)? Compruébalo en cualquiera de los editores.
  3. Calcula, para cada cliente, el número de pedidos y el gasto medio, mostrando 0 en lugar de NULL para quien no ha comprado nada.