Esattamente. NULL
rappresenta un valore sconosciuto, non un valore specifico (non è lo stesso di NULL
in C, o nil
in Ruby, ecc.) In SQL, se confronti qualcosa con il valore sconosciuto, anche il risultato è sconosciuto. E non otterrai le righe in cui WHERE
la condizione è sconosciuta.
Prova questo:
SELECT NULL <> 2;
e vedrai NULL
come risultato.
Prova questo:
SELECT * FROM t WHERE NULL;
e nessuna riga uscirà, anche se la tabella t
è enorme.
Se hai davvero bisogno di ciò che hai detto di volere (e non lo sto sostenendo), puoi fare qualcosa del genere:
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