SQL关于子集中有NULL的问题解析

问题描述: 在项目中,伦理修正案的发起需要检测子集中是否包含已存在的项目编号,如果包含则不能发起。
但是,由于子集中含有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值。

posted @ 2021-05-31 10:12  xuxuzhaozhao  阅读(60)  评论(0编辑  收藏  举报