Exactamente. NULL representa un valor desconocido, no un valor específico (no es lo mismo que NULL en C, o nil en Ruby, etc.) En SQL, si compara algo con el valor desconocido, el resultado también es desconocido. Y no obtendrá las filas donde WHERE la condición es desconocida.
Prueba esto:
SELECT NULL <> 2;
y verás NULL como resultado.
Prueba esto:
SELECT * FROM t WHERE NULL;
y no saldrán filas, incluso si la tabla t es enorme.
Si realmente necesitas lo que dijiste que querías (y no estoy defendiendo esto), puedes hacer algo como esto:
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