SQL · comparaciones y NULL

IS DISTINCT FROM: comparar valores incluyendo NULL

Obtén verdadero o falso al comparar dos expresiones aunque una o ambas sean NULL, y distingue esta intención de una simple comprobación IS NULL.

Lectura: 6–8 minSQL comprobadoPráctica con pistas
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.

Comparación que incluye NULL
valor_a IS DISTINCT FROM valor_b
valor_a IS NOT DISTINCT FROM valor_b

Esto 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.

Comportamiento de la comparación
ABA = BA IS NOT DISTINCT FROM B
11verdaderoverdadero
12falsofalso
1NULLdesconocidofalso
NULLNULLdesconocidoverdadero

Ejemplo comprobado

La siguiente consulta construye cuatro pares y compara cada uno de las dos maneras. Se comprobó en SQLite 3.46.1.

Verdadero o falso incluso con NULL
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;
Resultado comprobado
actualesperadoes_distintoes_igual_incluyendo_null
enviadoenviado01
pendienteenviado10
NULLenviado10
NULLNULL01

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

Intermedia · NULL

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.

Qué debes recordar

  • Las comparaciones ordinarias con NULL pueden devolver desconocido.
  • IS NOT DISTINCT FROM expresa igualdad incluyendo NULL con NULL.
  • IS DISTINCT FROM expresa diferencia incluyendo el caso de un único NULL.
  • No sustituye a IS NULL cuando solo quieres comprobar ausencia.
  • La sintaxis cambia según motor y versión.

Conceptos relacionados

Fuentes técnicas consultadas