Exatamente.
NULL
representa um valor desconhecido, não um valor específico (não é o mesmo que NULL
em C, ou nil
em Ruby, etc.) Em SQL, se você comparar algo com o valor desconhecido, o resultado também será desconhecido. E você não obterá as linhas onde WHERE
condição é desconhecida. Tente isto:
SELECT NULL <> 2;
e você verá
NULL
como resultado. Tente isto:
SELECT * FROM t WHERE NULL;
e nenhuma linha sairá, mesmo se a tabela
t
é enorme. Se você realmente precisa do que disse que queria (e eu não estou defendendo isso), você pode fazer algo assim:
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