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'→ 结果为UNKNOWNNULL != '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'→ 结果为UNKNOWNNULL = '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
相关产品推荐
相关产品推荐

