Exactamente. NULL
representa un valor desconocido, no un valor específico (no es lo mismo que NULL
en C, o nil
en Ruby, etc.) En SQL, si compara algo con el valor desconocido, el resultado también es desconocido. Y no obtendrá las filas donde WHERE
la condición es desconocida.
Prueba esto:
SELECT NULL <> 2;
y verás NULL
como resultado.
Prueba esto:
SELECT * FROM t WHERE NULL;
y no saldrán filas, incluso si la tabla t
es enorme.
Si realmente necesitas lo que dijiste que querías (y no estoy defendiendo esto), puedes hacer algo como esto:
SELECT T.f1, T.f2
FROM (SELECT NULL f1, 'a' f2) T
WHERE ((T.f1 IS NULL OR T.f2 IS NULL)
AND (T.f1 IS NOT NULL OR T.f2 IS NOT NULL))
OR T.f1 <> T.f2