最近我碰巧遇到了sql Server和Oracle中的not().尝试将NOT条件和not()与不同的运算符(如LIKE,IN等)进行比较的不同示例.我没有看到结果集和记录计数方面的任何差异,但是如果两者都做同样的事情,则希望与社区确认或任何警告?
示例查询
select count(*) from Emp where country not in ('ENGLAND UK','HAITI','IRELAND') select count(*) from Emp where not(country in ('ENGLAND UK','IRELAND'))
解决方法
NOT关键字的两个展示位置在逻辑上都是等效的,并给出相同的结果.在括号内的表达式之前不会反转该表达式的结果,但这是传统的布尔逻辑,而不是特定于sql.
在T-sql中,sql Server 2014和sql Server 2016中的执行计划与您的示例相同(假设:表具有主键,而国家/地区未编入索引).
有一点需要注意,特别是您给出的示例:当IN运算符的参数中包含NULL值时,IN运算符的行为与预期的不同.对于Oracle,see here;
对于T-sql,请考虑以下事项:
select 1 where 'A' in (null)
这不会返回一行.这似乎微不足道,但是:
select 1 where 'A' not in (null)
此声明不会返回一行.现在我们可以争辩说,如果我们从第一个语句中逻辑反转表达式,它肯定会返回一行:
select 1 where not ('A' in (null))
但事实并非如此,因为IN(NULL)的计算结果为neither true nor false.