Когда подзапрос, используемый с NOT IN, содержит любые NULL значения, весь внешний запрос возвращает пустой результат — даже если совпадающие значения явно существуют.
SQL использует трёхзначную логику: TRUE, FALSE и UNKNOWN. Любое сравнение, включающее NULL, даёт UNKNOWN.
Оператор NOT IN требует, чтобы каждое сравнение в наборе было однозначно FALSE для включения строки. Если хотя бы одно значение — NULL, условие никогда не может быть полностью вычислено, поэтому строк не возвращается.
Например:
-- Если подзапрос возвращает (1, 2, NULL), этот запрос не возвращает строк
SELECT * FROM orders
WHERE customer_id NOT IN (1, 2, NULL);
Используй NOT EXISTS с коррелированным подзапросом. Он работает построчно и игнорирует NULL значения, давая надёжные результаты:
SELECT * FROM orders o
WHERE NOT EXISTS (
SELECT 1 FROM customers c
WHERE c.customer_id = o.customer_id
);
NULL — ошибки не будет, но результаты окажутся невернымиWHERE column IS NOT NULL внутри подзапросаКогда подзапрос NOT IN содержит значения NULL, внешний запрос возвращает пустой набор результатов, потому что трёхзначная логика SQL делает невозможным точно определить, какие строки должны быть включены.
Новый — ещё не проверен сообществом
Вы