为何过滤op列时NULL值被排除?两次SQL查询结果差异疑问
为什么第二条SQL查询中op的NULL值被省略?
这是SQL中NULL值的逻辑比较特性导致的:
- 在SQL里,NULL代表“未知值”,当你用
op != 'D'进行比较时,如果op是NULL,这个比较的结果既不是TRUE也不是FALSE,而是UNKNOWN。 WHERE子句只会保留条件计算结果为TRUE的行,所有结果为UNKNOWN或FALSE的行都会被过滤。
对应你的两条查询:
- 第一条查询没有
op != 'D'的过滤条件,所以op为NULL且满足r=1的行能进入分组统计,结果里会包含NULL值的计数。 - 第二条查询添加了
op != 'D',此时op为NULL的行因为比较结果是UNKNOWN,不满足WHERE的筛选要求,被直接过滤掉,最终分组结果自然就没有NULL值的统计项了。
如果需要保留op为NULL的行同时排除op='D'的行,可以修改条件为:
where r = 1 and (op != 'D' or op is null)
内容的提问来源于stack exchange,提问作者Hemanth Annavarapu
相关产品推荐
相关产品推荐

