You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS SQL Server中NULL值引发查询结果差异的原因咨询

为什么NULL值导致两个SQL查询结果不同?

核心原因是SQL遵循三值逻辑(3VL):NULL参与任何标量比较(=、!=等)的结果既不是TRUE也不是FALSE,而是UNKNOWN;而CASE语句的WHEN子句仅会在条件结果为TRUE时执行对应分支,UNKNOWN和FALSE都会进入ELSE分支。

分析第一个查询

第一个查询的判断逻辑:

WHEN (RELATIONSHIP != 'Parent' AND RELATIONSHIP != 'Child') 
    THEN 0 
    ELSE 1

对于ITEM=2的NULL值:

  • NULL != 'Parent' → 结果为UNKNOWN
  • NULL != 'Child' → 结果为UNKNOWN
  • 逻辑与(AND)运算:UNKNOWN AND UNKNOWN → 结果仍为UNKNOWN

由于WHEN只匹配TRUE,UNKNOWN不满足条件,因此进入ELSE分支,最终family值为1。

分析第二个查询

第二个查询的判断逻辑:

WHEN (RELATIONSHIP = 'Parent' OR RELATIONSHIP = 'Child') 
    THEN 1 
    ELSE 0

对于ITEM=2的NULL值:

  • NULL = 'Parent' → 结果为UNKNOWN
  • NULL = 'Child' → 结果为UNKNOWN
  • 逻辑或(OR)运算:UNKNOWN OR UNKNOWN → 结果仍为UNKNOWN

同样,WHEN不匹配UNKNOWN,进入ELSE分支,最终family值为0。

关于你的疑问补充

你提到的“所有NULL值的标量比较结果均为假”并不准确——NULL的比较结果是UNKNOWN,而非FALSE。SQL的三值逻辑中,CASE、WHERE等语句都会将UNKNOWN视为不满足条件,这才是两个查询结果差异的核心。

第三个查询之所以结果符合预期,是因为它明确通过RELATIONSHIP IS NULL处理了NULL的情况,将NULL归到THEN 0的分支,避免了三值逻辑的影响。

内容的提问来源于stack exchange,提问作者MRodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:05:29