Comparar con NULL: IS NULL e IS DISTINCT FROM
BásicoNULL significa «valor desconocido». Cualquier comparación con NULL (=, <>, <) no da verdadero ni falso: da desconocido, y WHERE descarta esas filas. Para preguntar si falta el valor se usa IS NULL; para comparar tratando dos NULL como iguales, IS DISTINCT FROM.
Sintaxis
WHERE columna IS NULL
WHERE columna IS NOT NULL
WHERE columna IS DISTINCT FROM valor -- «distinto», contando NULL como un valor másEjemplo
SELECT
s.id,
s.rating,
s.rating = NULL AS igual_a_null,
s.rating IS NULL AS es_null,
s.rating <> 4.5 AS distinto_con_signo,
(s.rating <> 4.5 OR s.rating IS NULL) AS distinto_contando_null
FROM sellers AS s
WHERE s.country = 'UY'
ORDER BY s.id;Resultado
| id | rating | igual_a_null | es_null | distinto_con_signo | distinto_contando_null |
|---|---|---|---|---|---|
| 30 | 3.81 | NULL | false | true | true |
| 42 | 4.82 | NULL | false | true | true |
| 151 | 3.62 | NULL | false | true | true |
| 177 | NULL | NULL | true | NULL | true |
| 178 | 4.86 | NULL | false | true | true |
Cómo leerlo
rating = NULL da NULL (desconocido) en todas las filas, incluso en la del vendedor 177, que no tiene calificación: nunca sirve para filtrar. IS NULL sí responde verdadero o falso. En la fila 177, rating <> 4.5 también da desconocido, así que un WHERE rating <> 4.5 dejaría fuera a ese vendedor. La última columna lo incluye porque agrega OR rating IS NULL; rating IS DISTINCT FROM 4.5 es la forma corta de esa misma condición.
Error común
Así no
SELECT s.id, s.store_name
FROM sellers AS s
WHERE s.rating = NULL;Buscar los faltantes con = NULL. La condición nunca es verdadera, así que la consulta devuelve 0 filas sin dar error, cuando hay 28 vendedores sin calificación. Lo mismo pasa con <> NULL. La forma correcta es WHERE rating IS NULL.
En otros motores: PostgreSQL, SQL Server, BigQuery, Snowflake, MySQL
PostgreSQL
PostgreSQL acepta
IS DISTINCT FROM, pero el editor de este curso todavía no lo reconoce y responde que no pudo interpretar la consulta. En tus ejercicios usa la forma larga:(columna <> valor OR columna IS NULL).PostgreSQLSQL ServerBigQuerySnowflake
Aceptan
IS DISTINCT FROMeIS NOT DISTINCT FROM. En SQL Server está disponible desde la versión 2022.MySQL
No tiene
IS DISTINCT FROM. Usa el operador<=>, una igualdad que trata dosNULLcomo iguales; para «distinto» se niega conNOT.WHERE NOT (rating <=> 4.5)
Estos fragmentos no se ejecutan en el curso: se muestran como referencia de cada motor.