为什么SQL中NOT LIKE搭配OR无法过滤指定开头记录,替换为AND就正常?
问题原因解析
你给出的查询语句如下:
SELECT CategoryName, Description FROM [Categories] Where Description NOT LIKE 'S%' OR Description NOT LIKE 'D%'
问题的核心是OR和AND的逻辑语义差异,结合布尔运算规则导致结果不符合预期:
OR的运算规则为:只要左右两个条件有一个成立,整个判断结果就为真,对应记录就会被返回。
任何记录的Description不可能同时以S和D开头,所以所有记录都会至少满足两个NOT LIKE条件中的一个:- S开头的记录:
NOT LIKE 'S%'为假,但NOT LIKE 'D%'为真,OR运算结果为真,会被错误保留 - D开头的记录:
NOT LIKE 'S%'为真,但NOT LIKE 'D%'为假,OR运算结果为真,会被错误保留 - 其他开头的记录:两个条件都为真,
OR运算结果为真,正常保留
也就是说使用OR时,WHERE条件恒为真,相当于没有做任何筛选,自然达不到排除S、D开头记录的要求。
- S开头的记录:
- 换成
AND后,运算规则变为两个条件同时成立,整个判断结果才为真:
只有同时满足「不是S开头」和「不是D开头」的记录才会被保留,刚好符合你的筛选需求。
你也可以用德摩根定律验证这个逻辑:你需要的筛选逻辑是NOT (Description LIKE 'S%' OR Description LIKE 'D%')(排除以S开头或者以D开头的记录),根据德摩根定律展开后就是Description NOT LIKE 'S%' AND Description NOT LIKE 'D%',也能印证用AND才是正确写法。
内容的提问来源于stack exchange,提问作者Ajeet Malviya
相关产品推荐
相关产品推荐

