Cómo tratar valores NULL en SQL Server: ISNULL y COALESCE
En una base de datos real es normal encontrar columnas sin valor: teléfonos que faltan, comisiones sin rellenar o fechas todavía desconocidas. Esos espacios vacíos son valores NULL y, si no se tratan, provocan totales erróneos e informes llenos de celdas en blanco. En SQL Server, las funciones ISNULL y COALESCE sirven precisamente para esto: devuelven un valor alternativo siempre que encuentran un NULL.
Requisitos previos
- Acceso a SQL Server (2012 o superior) o a Azure SQL Database.
- SQL Server Management Studio o Azure Data Studio para ejecutar las consultas.
- Una base de datos de prueba y conocimientos básicos de SELECT en T-SQL.
Paso 1: Entender qué es un valor NULL
NULL no es cero ni una cadena vacía: representa la ausencia de información, algo desconocido. Por eso no se puede comparar con el operador igual. Para comprobar si una columna está vacía se usa siempre IS NULL o IS NOT NULL.
-- Errado: NULL nao e igual a nada, nunca devolve linhas
SELECT nome FROM Clientes WHERE telefone = NULL;
-- Correto
SELECT nome FROM Clientes WHERE telefone IS NULL;
Paso 2: Sustituir NULL con ISNULL
La función ISNULL recibe dos argumentos: la expresión que se comprueba y el valor que se devuelve si es NULL. Es la forma más directa de mostrar un texto amigable en lugar de un espacio vacío.
SELECT
nome,
ISNULL(telefone, 'Sem contacto') AS telefone
FROM Clientes;
Si la columna telefone tiene valor, se mantiene; si es NULL, aparece el texto por defecto ("Sem contacto"). La misma idea sirve para números, algo esencial en los cálculos:
SELECT
produto,
preco * ISNULL(quantidade, 0) AS total
FROM Vendas;
Sin ISNULL, cualquier fila con quantidade en NULL daría un total NULL y contaminaría toda la operación.
Paso 3: Usar COALESCE para varias alternativas
COALESCE va más allá: acepta varios argumentos y devuelve el primero que no sea NULL. Es ideal cuando existe una cascada de columnas y quieres la primera que esté rellena.
SELECT
nome,
COALESCE(telemovel, telefone_fixo, email, 'Sem contacto') AS contacto
FROM Clientes;
SQL Server evalúa de izquierda a derecha: si telemovel existe, lo usa; si no, pasa a telefone_fixo, luego a email y, por último, al texto por defecto. Una sola función resuelve lo que exigiría varios CASE anidados.
Paso 4: Saber cuándo usar cada una
Las dos funciones parecen iguales, pero tienen diferencias importantes, descritas en la documentación oficial de Microsoft:
- Número de argumentos: ISNULL acepta solo dos; COALESCE acepta varios.
- Portabilidad: COALESCE forma parte del estándar ANSI SQL y existe en otras bases de datos; ISNULL es exclusivo de SQL Server.
- Tipo de datos: ISNULL asume el tipo del primer argumento y puede truncar el valor de sustitución; COALESCE sigue las reglas de precedencia de tipos.
Esa diferencia de tipo es una trampa habitual. Fíjate en el ejemplo:
DECLARE @codigo varchar(2) = NULL;
SELECT ISNULL(@codigo, 'ABCDE') AS com_isnull, -- devolve 'AB'
COALESCE(@codigo, 'ABCDE') AS com_coalesce; -- devolve 'ABCDE'
Como @codigo es varchar(2), ISNULL corta el texto a dos caracteres, mientras que COALESCE conserva el valor completo. Por eso, una buena regla es usar COALESCE por defecto y reservar ISNULL para casos simples de dos opciones.
Consejo: en columnas numéricas usadas en sumas o medias, trata el NULL con 0 (o con el valor correcto para tu cálculo) antes de agregar.
Verificar el resultado
Para confirmar que el tratamiento funcionó, cuenta cuántas filas siguen sin contacto después de aplicar COALESCE. Si todo está correcto, el resultado debe ser 0:
SELECT COUNT(*) AS ainda_sem_contacto
FROM (
SELECT COALESCE(telemovel, telefone_fixo, email) AS contacto
FROM Clientes
) AS t
WHERE contacto IS NULL;
Un valor de 0 significa que todas las filas ya tienen un contacto. Si aparece un número mayor, esas filas tienen las tres columnas vacías a la vez y necesitan un valor final por defecto.
Conclusión
Con ISNULL y COALESCE controlas exactamente lo que aparece cuando faltan datos, evitando sumas erróneas e informes con espacios en blanco. El siguiente paso es aplicar estas funciones dentro de vistas o medidas, para que los datos lleguen ya limpios a herramientas como Power BI. ¿Qué columna de tu modelo necesita más un valor por defecto?