SQL Server中NOT为何无法匹配NULL?IsDuplicate字段查询疑问
问题原因解析
这是SQL的三值逻辑特性导致的问题。SQL里处理NULL时,所有和NULL的比较操作(比如=、!=等)返回的结果既不是TRUE也不是FALSE,而是UNKNOWN(未知)。
当IsDuplicate的值为NULL时,IsDuplicate = '1'这个表达式的结果是UNKNOWN,对它取反NOT(UNKNOWN)得到的还是UNKNOWN。而WHERE子句只会筛选出判断结果为TRUE的行,UNKNOWN的行不会被选中,所以WHERE NOT(IsDuplicate = '1')就漏掉了值为NULL的记录,自然无法覆盖你想要的0和NULL的情况。
再看你提到的两种有效写法:
WHERE IsDuplicate = '0' OR IsDuplicate IS NULL:直接通过IsDuplicate IS NULL明确判断NULL,这是SQL里专门检测NULL的语法,结果是TRUE,所以能选中NULL的行;WHERE ISNULL(IsDuplicate, 0) = 0:用ISNULL()函数把NULL转换成了0,这样比较的结果就是TRUE,也能正确选中目标行。
如果想让类似NOT(IsDuplicate = '1')的写法生效,可以改成:
WHERE NOT(IsDuplicate = '1') OR IsDuplicate IS NULL
或者用COALESCE函数统一处理NULL:
WHERE COALESCE(IsDuplicate, '0') != '1'
内容的提问来源于stack exchange,提问作者Aashishkebab
相关产品推荐
相关产品推荐

