Prawidłowo (ale zauważ, że IN
jest operatorem, a nie klauzulą i działa tak ogólnie w SQL, nie tylko w Oracle).
where 1 not in (null,1)
jest równoważne z:
where 1 != null and 1 != 1
które tak naprawdę powinno być napisane jako:
WHERE 1 NOT IN (NULL, 1)
i
WHERE 1 <> NULL AND 1 <> 1
czyli to samo co:
WHERE (1 <> NULL) AND (1 <> 1)
co oznacza:
WHERE UNKNOWN AND FALSE
i dalej jako:
WHERE FALSE
Więc poprawnie nie zwraca żadnych wierszy.
Zauważ, że jeśli masz WHERE 1 NOT IN (NULL, 2)
, oszacowałoby się na WHERE UNKNOWN
(pozostawiony jako ćwiczenie) i żadne wiersze również nie zostaną zwrócone.