Contenido de esta guía
Respuesta rápida
IS DISTINCT FROM compara dos expresiones y siempre devuelve verdadero o falso, incluso cuando interviene NULL. Su pareja IS NOT DISTINCT FROM expresa igualdad tratando dos valores NULL como equivalentes.
valor_a IS DISTINCT FROM valor_b
valor_a IS NOT DISTINCT FROM valor_bEsto resuelve un problema distinto de IS NULL: aquí comparas dos expresiones, no solo compruebas si una de ellas carece de valor.
Modelo mental: convertir «desconocido» en una respuesta binaria
Con los operadores ordinarios, NULL = NULL y NULL <> NULL no son verdaderos ni falsos: producen un resultado desconocido. En un WHERE, ese desconocido no pasa el filtro.
IS NOT DISTINCT FROM responde una pregunta más práctica: «¿estos dos valores deben considerarse iguales, incluyendo el caso en que ambos son NULL?». IS DISTINCT FROM responde la negación.
| A | B | A = B | A IS NOT DISTINCT FROM B |
|---|---|---|---|
| 1 | 1 | verdadero | verdadero |
| 1 | 2 | falso | falso |
| 1 | NULL | desconocido | falso |
| NULL | NULL | desconocido | verdadero |
Ejemplo comprobado
La siguiente consulta construye cuatro pares y compara cada uno de las dos maneras. Se comprobó en SQLite 3.46.1.
WITH comparaciones(actual, esperado) AS (
VALUES
('enviado', 'enviado'),
('pendiente','enviado'),
(NULL, 'enviado'),
(NULL, NULL)
)
SELECT
actual,
esperado,
actual IS DISTINCT FROM esperado AS es_distinto,
actual IS NOT DISTINCT FROM esperado AS es_igual_incluyendo_null
FROM comparaciones;| actual | esperado | es_distinto | es_igual_incluyendo_null |
|---|---|---|---|
| enviado | enviado | 0 | 1 |
| pendiente | enviado | 1 | 0 |
| NULL | enviado | 1 | 0 |
| NULL | NULL | 0 | 1 |
Cuándo aporta valor
- Comparar una versión anterior y una nueva: detectas cambios aunque ambas columnas puedan ser NULL.
- Condiciones de JOIN con valores opcionales: puedes definir explícitamente que NULL con NULL cuenta como coincidencia.
- Pruebas de igualdad: evitas expresiones largas del tipo
(a = b OR (a IS NULL AND b IS NULL)).
No sustituye a IS NULL. Si tu pregunta es simplemente «¿falta este dato?», IS NULL / IS NOT NULL sigue siendo más directo.
Diferencias entre motores
PostgreSQL documenta IS DISTINCT FROM y IS NOT DISTINCT FROM como predicados de comparación que tratan NULL como un valor comparable. SQLite admite las mismas formas y además documenta IS/IS NOT como abreviaturas propias.
SQL Server incorpora IS [NOT] DISTINCT FROM desde SQL Server 2022. MySQL utiliza otro operador para la igualdad segura con NULL: <=>. Por eso no copies esta sintaxis entre motores sin comprobar la versión.
Errores frecuentes
Confundir «distinto» con IS NOT NULL
a IS DISTINCT FROM b compara dos valores. a IS NOT NULL solo pregunta si a tiene un valor conocido.
Usar COALESCE con un valor centinela
COALESCE(a, 'N/A') = COALESCE(b, 'N/A') puede mezclar un NULL real con un valor válido que casualmente sea 'N/A'. El predicado específico evita esa ambigüedad.
Práctica guiada
Detecta si dos valores cambiaron
Completa una consulta que devuelva 1 cuando valor_anterior y valor_nuevo sean distintos, incluyendo los casos con NULL.
Criterio de éxito: dos NULL no cuentan como cambio; NULL frente a un valor sí cuenta.
IS DISTINCT FROM.Solución razonada
SELECT
valor_anterior,
valor_nuevo,
valor_anterior IS DISTINCT FROM valor_nuevo AS cambio
FROM historial;El predicado devuelve verdadero cuando solo uno de los valores es NULL o cuando ambos valores conocidos son diferentes. Devuelve falso si ambos son iguales, incluidos dos NULL.
Qué debes recordar
- Las comparaciones ordinarias con NULL pueden devolver desconocido.
IS NOT DISTINCT FROMexpresa igualdad incluyendo NULL con NULL.IS DISTINCT FROMexpresa diferencia incluyendo el caso de un único NULL.- No sustituye a
IS NULLcuando solo quieres comprobar ausencia. - La sintaxis cambia según motor y versión.