На семантику NOT IN
влияет значение NULL
в списке. В SQL NULL
означает «Я не знаю значения; это может быть что угодно».
Итак, если вы сделаете:
where 1 in (1, 2)
тогда возвращается true.
where 1 in (3, 4)
возвращает false.
Пока все хорошо. Теперь рассмотрим:
where 1 not in (1, 2, NULL)
Ну, "1" явно в списке. Так что это возвращает ложь.
where 1 not in (3, 4, NULL)
Ну, «1» - это не «3» или «4». Но это NULL
? Мы не знаем Таким образом, это возвращает NULL
, а не истина. И NULL
обрабатывается так же, как и ложь в условии WHERE
, что означает, что строка отфильтрована. (Как примечание: check
условия ведут себя по-разному, только явное ложь не дает check
.)
Итак, ничего не возвращается с NOT IN
, если любое из значений NULL
.
Эта ситуация почти всегда возникает в контексте подзапросов (а не констант). По этой причине я рекомендую использовать NOT EXISTS
вместо NOT IN
во всех случаях с подзапросом.