これ:
Error not in ('Timeout','Connection Error');
意味的には次と同等です:
Error <> 'TimeOut' AND Error <> 'Connection Error'
null比較に関する規則は、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
またはコード> 短絡しない、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<>'ブルース'
決定することはできません、真でも偽でもありません
NULL<>'バナー'
決定することはできません、真でも偽でもありません
したがって、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
何も返されません