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