如何解决带有 NULL NOT IN 子句的 TSQL,它会失败还是不会失败?
在为我的评分项目提交代码时,有人指出,如果任何标志具有 NOT IN
值,则此带有 NULL
的逻辑可能会失败。我已经做了功课和测试,但无法确认这一点,即使处理 NULL
,我下面的查询也总是正常工作。我的教授错了吗?我读过其他带有 NULL 的 NOT IN
坏情况,但它们与括号内的 NULL 有点不同(例如,NOT IN ('Alpha',NULL)
在我的情况下我已经定义了文字。我只想确保当前代码是 100 % NULL 证明。
谁能打破我的理论?或者我们都同意这是正确的。 我在最新的 SQL 2016 上使用默认设置,我认为默认情况下 ANSI NULL OFF(如果它有任何区别)。我实际上测试了我的 ON/OFF 代码,没有任何区别。
我还对每个案例进行了逻辑解释以支持我的案例。 补充:在我的情况下,我不想选择任何 NULL,只需要带一个原始 `4=ID,'X-Ray' = 标志
DROP TABLE If exists #x
SELECT * INTO #x FROM (
SELECT 1 ID,'Alpha' Flag UNION SELECT 777 ID,NULL Flag UNION
SELECT 3 ID,'Bravo' Flag UNION SELECT 4 ID,'X-Ray' Flag
) a
SELECT * FROM #x
WHERE Flag NOT IN ('Alpha','Bravo')
--Case#1 'Alpha' <> 'Alpha' AND 'Alpha' <> 'Bravo'
-- TRUE FALSE ==> FALSE (based on True AND False)
--Case#2 'X-Ray' <> 'Alpha' AND 'X-Ray' <> 'Bravo'
-- TRUE TRUE ==> TRUE (TRUE and TRUE)
--Case#3 NULL <> 'Alpha' AND NULL <> 'Bravo'
-- UNknown UNknown ==> UKNOWN = not TRUE (never selected )
解决方法
问题在于 null
值 在 的参数中 NOT IN()
。所以测试用例是:
SELECT *
FROM #x
WHERE Flag NOT IN ('Alpha','Bravo',NULL)
对于您的示例数据,此 returns no rows。
为什么会这样是因为,基本上,数据库将 NOT IN
翻译为:
WHERE Flag <> 'Alpha' AND Flag <> 'Bravo' AND Flag <> NULL
Flag <> NULL
返回 NULL
,无论 Flag
的值如何,所以最后一个条件永远不可能为真,所有行都被过滤掉。有人说 NOT IN
不是 NULL
安全的。
当然,如果您使用的是从不包含 NULL
值的字面值列表,那么您可以使用 NOT IN
。当子查询在 NOT IN
中起作用时,问题经常出现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。