Genau. NULL
stellt einen unbekannten Wert dar, keinen bestimmten Wert (er ist nicht dasselbe wie NULL
in C oder nil
in Ruby usw.) Wenn Sie in SQL etwas mit dem unbekannten Wert vergleichen, ist das Ergebnis ebenfalls unbekannt. Und Sie erhalten nicht die Zeilen, in denen WHERE
steht Zustand ist unbekannt.
Versuchen Sie Folgendes:
SELECT NULL <> 2;
und Sie werden NULL
sehen als Ergebnis.
Versuchen Sie Folgendes:
SELECT * FROM t WHERE NULL;
und es werden keine Zeilen ausgegeben, auch wenn die Tabelle t
ist riesig.
Wenn Sie wirklich brauchen, was Sie sagten, dass Sie es wollten (und ich befürworte das nicht), können Sie so etwas tun:
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