这个 :
Error not in ('Timeout','Connection Error');
在语义上等效于:
Error <> 'TimeOut' AND Error <> 'Connection Error'
有关空比较的规则也适用于IN。因此,如果Error的值为NULL,则数据库无法使表达式为true。
要解决此问题,您可以这样做:
COALESCE(Error,'') not in ('Timeout','Connection Error');
或者更好:
Error IS NULL OR Error not in ('Timeout','Connection Error');
甚至更好:
CASE WHEN Error IS NULL THEN 1 ELSE Error not in ('Timeout','Connection Error') THEN 1 END = 1
OR不短路,CASE可以使您的查询短路
也许一个具体的例子可以说明为什么
NULL NOT IN expression什么都不返回:
给定此数据:http :
//www.sqlfiddle.com/#!2/0d5da/11
create table tbl( msg varchar(100) null, description varchar(100) not null );insert into tbl values('hi', 'greet'),(null, 'nothing');
然后执行以下表达式:
select 'hulk' as x, msg, description from tbl where msg not in ('bruce','banner');
那只会输出“ hi”。
NOT IN转换为:
select 'hulk' as x, msg, description from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'无法确定,甚至不成立,甚至不成立
NULL <> 'banner'无法确定,甚至不成立,甚至不成立
因此,空值表达式可以有效地解析为:
can't be determined AND can't bedetermined
实际上,如果您的RDBMS在SELECt上支持布尔值(例如MySQL,Postgresql),则可以看到原因:http
://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
返回null。
这也返回null:
select null <> 'Bruce' and null <> 'Banner'
鉴于您正在使用
NOT IN,它基本上是一个AND表达式。
NULL AND NULL
结果为NULL。因此,就像您正在执行以下 *** 作:http :
//www.sqlfiddle.com/#!2/0d5da/12
select * from tbl where null
一无所有
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)