Esse :
Error not in ('Timeout','Connection Error');
é semanticamente equivalente a:
Error <> 'TimeOut' AND Error <> 'Connection Error'
As regras sobre comparação nula também se aplicam a IN. Portanto, se o valor de Error for NULL, o banco de dados não poderá tornar a expressão verdadeira.
Para corrigir, você pode fazer isso:
COALESCE(Error,'') not in ('Timeout','Connection Error');
Ou melhor ainda:
Error IS NULL OR Error not in ('Timeout','Connection Error');
Ou melhor ainda:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
não entra em curto-circuito, o CASE pode de alguma forma causar um curto-circuito na sua consulta Talvez um exemplo concreto possa ilustrar porque
NULL NOT IN expression
não retorna nada:Dados estes dados: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');
E você faz esta expressão:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
Isso produzirá apenas 'oi'.
O NOT IN é traduzido como:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
não pode ser determinado, nem mesmo verdadeiro, nem mesmo falso NULL <> 'banner'
não pode ser determinado, nem mesmo verdadeiro nem mesmo falso Portanto, a expressão de valor nulo, efetivamente resolvida para:
can't be determined AND can't bedetermined
Na verdade, se o seu RDBMS suporta boolean em SELECT (por exemplo, MySQL, Postgresql), você pode ver o porquê:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
Isso retorna null.
Isso também retorna null:
select null <> 'Bruce' and null <> 'Banner'
Dado que você está usando
NOT IN
, que é basicamente uma expressão AND. NULL AND NULL
Resultados para NULL. Então é como se você estivesse fazendo um:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
Nada será devolvido