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