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
COALESCEdevuelve el primer valor que no seaNULLdentro de una lista.ISNULLsustituye un valorNULLpor una alternativa.NULLIFdevuelveNULLcuando 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.