问题描述: 在项目中,伦理修正案的发起需要检测子集中是否包含已存在的项目编号,如果包含则不能发起。
但是,由于子集中含有NULL值,即使子集中未包含项目编号,依然不能正确发起。
验证:
-- 当 ‘SET ANSI_NULLS ON’ 时,
-- 如果子集有NULL,以下返回false,
-- 因为NULL表示UNKNOWN,即不知道‘1’是不是存在于子集中则直接返回 false
SELECT CASE WHEN '1' NOT IN ( SELECT '2'
UNION ALL
SELECT NULL ) THEN 'true'
ELSE 'false'
END;
返回:
false
微软官方文档给出的解释:
关于ANSI_NULLS的原文: https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql?view=sql-server-ver15
解决方法就是先排除子集中的NULL值。