复现
复现
SELECT * FROM t WHERE id NOT IN (1, 2, NULL);
-- 结果为空:id <> NULL 为 UNKNOWN,不满足 WHERE
SELECT * FROM t WHERE id NOT IN (SELECT user_id FROM blacklist);
-- blacklist.user_id 若存在 NULL,同样整体为空改写
改写
SELECT * FROM t
WHERE NOT EXISTS (
SELECT 1 FROM blacklist b WHERE b.user_id = t.id
);子查询列可空时 NOT IN 语义被 NULL 破坏,生产 SQL 优先 NOT EXISTS 或先过滤 IS NOT NULL。