Exactement. NULL
représente une valeur inconnue, pas une valeur spécifique (ce n'est pas la même chose que NULL
en C, ou nil
en Ruby, etc.) En SQL, si vous comparez quelque chose à la valeur inconnue, le résultat est également inconnu. Et vous n'obtiendrez pas les lignes où WHERE
l'état est inconnu.
Essayez ceci :
SELECT NULL <> 2;
et vous verrez NULL
en conséquence.
Essayez ceci :
SELECT * FROM t WHERE NULL;
et aucune ligne ne sortira, même si la table t
est énorme.
Si vous avez vraiment besoin de ce que vous avez dit vouloir (et je ne le préconise pas), vous pouvez faire quelque chose comme ceci :
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