Exakt. NULL
representerar ett okänt värde, inte något specifikt värde (det är inte detsamma som NULL
i C eller nil
i Ruby, etc.) I SQL, om du jämför något med det okända värdet, är resultatet också okänt. Och du kommer inte att få raderna där WHERE
skicket är okänt.
Prova detta:
SELECT NULL <> 2;
och du kommer att se NULL
som resultat.
Prova detta:
SELECT * FROM t WHERE NULL;
och inga rader kommer ut, även om tabellen t
är enorm.
Om du verkligen behöver det du sa att du ville ha (och jag förespråkar inte detta), kan du göra något så här:
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