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.
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:
| 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:
| 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.
| 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 = NULLnunca devuelve filas. UsaIS NULLoIS NOT NULL(lo vimos en operadores). - Mezclar tipos.
COALESCE(cuenta, 'Sin cuenta')falla porquecuentaes numérica; convierte primero conCAST. - Usar
COALESCEdentro delWHEREsobre una columna indexada.WHERE COALESCE(cuenta, 0) = 0impide que el motor use un índice sobrecuenta. Es mejorWHERE cuenta = 0 OR cuenta IS NULL.
Practica
- Lista los pedidos mostrando
'Sin cliente'cuandoidClientesseaNULL. - ¿Qué devuelve
COALESCE(NULL, NULL, 3, 4)? Compruébalo en cualquiera de los editores. - Calcula, para cada cliente, el número de pedidos y el gasto medio, mostrando 0 en lugar de
NULLpara quien no ha comprado nada.