これ :
Error not in ('Timeout','Connection Error');
意味的には次と同等です。
Error <> 'TimeOut' AND Error <> 'Connection Error'
null 比較に関する規則は IN にも適用されます。したがって、Error の値が NULL の場合、データベースは式を真にすることができません。
修正するには、次のようにします。
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');
それは「こんにちは」だけを出力します。
NOT IN は次のように変換されます。
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
決められない、真でもない、偽でもない
NULL <> 'banner'
判断できない 真でもない 偽でもない
したがって、null 値の式は、実質的に次のように解決されます。
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
何も返されません