El síntoma: comparas con NULL y desaparecen filas que esperabas ver
En SQL, NULL representa un valor desconocido o ausente. Una comparación ordinaria como telefono = NULL no produce TRUE: el resultado lógico queda desconocido. Como WHERE conserva únicamente las filas cuya condición resulta verdadera, esas filas no aparecen.
Por eso el diagnóstico no consiste en cambiar el operador al azar, sino en preguntar si realmente quieres comparar un valor o comprobar ausencia.
Ejemplo reproducible: = NULL devuelve cero filas
Usamos tres clientes; dos no tienen teléfono:
WITH clientes(id, nombre, telefono) AS (
VALUES (1, 'Ana', '600111222'),
(2, 'Luis', NULL),
(3, 'Marta', NULL)
)
SELECT id, nombre
FROM clientes
WHERE telefono = NULL;| Filas devueltas |
|---|
| 0 |
La corrección: usa IS NULL para comprobar ausencia
WITH clientes(id, nombre, telefono) AS (
VALUES (1, 'Ana', '600111222'),
(2, 'Luis', NULL),
(3, 'Marta', NULL)
)
SELECT id, nombre
FROM clientes
WHERE telefono IS NULL
ORDER BY id;| id | nombre |
|---|---|
| 2 | Luis |
| 3 | Marta |
Diagnóstico en tres preguntas
- ¿Buscas ausencia? Usa
IS NULLoIS NOT NULL. - ¿El predicado contiene una columna nullable? Recuerda que algunas comparaciones pueden producir un estado desconocido.
- ¿Has añadido NOT? Negar una condición desconocida no la convierte automáticamente en verdadera.
Modelo mental: en SQL no basta con pensar en verdadero y falso. La lógica también puede producir un tercer estado, desconocido, y un filtro WHERE no conserva ese caso.
Error frecuente: cambiar = NULL por <> NULL
El operador cambia, pero el problema sigue
telefono <> NULL tampoco es la forma de pedir teléfonos presentes. Para esa intención usa telefono IS NOT NULL. Separa la comparación de valores de la comprobación de ausencia.
Práctica correctiva
Encuentra los clientes con teléfono conocido
Con los mismos tres clientes, escribe el predicado que devuelve solo a Ana.
= ni con <>.IS NOT NULL.Solución razonada
WITH clientes(id, nombre, telefono) AS (
VALUES (1, 'Ana', '600111222'),
(2, 'Luis', NULL),
(3, 'Marta', NULL)
)
SELECT id, nombre
FROM clientes
WHERE telefono IS NOT NULL
ORDER BY id;La intención es comprobar presencia, no comparar el teléfono con un valor concreto. IS NOT NULL expresa directamente esa pregunta.
Qué debes recordar
NULLno se compara como un valor ordinario.WHEREconserva condiciones verdaderas; un resultado desconocido queda fuera.- Usa
IS NULLeIS NOT NULLpara comprobar ausencia o presencia. - Antes de tocar el SQL, define si quieres comparar un valor o comprobar que falta.