Přesně tak. NULL představuje neznámou hodnotu, nikoli žádnou konkrétní hodnotu (není to totéž jako NULL v C nebo nil v Ruby atd.) V SQL, pokud něco porovnáte s neznámou hodnotou, výsledek je také neznámý. A nedostanete řádky kde WHERE stav je neznámý.
Zkuste toto:
SELECT NULL <> 2;
a uvidíte NULL jako výsledek.
Zkuste toto:
SELECT * FROM t WHERE NULL;
a nevyjdou žádné řádky, i když tabulka t je obrovský.
Pokud opravdu potřebujete to, co jste řekli, že chcete (a já to neobhajuji), můžete udělat něco takového:
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