Esto:
Error not in ('Timeout','Connection Error');
es semánticamente equivalente a:
Error <> 'TimeOut' AND Error <> 'Connection Error'
Las reglas sobre la comparación nula también se aplican a IN. Entonces, si el valor de Error es NULL, la base de datos no puede hacer que la expresión sea verdadera.
Para solucionarlo, podría hacer esto:
COALESCE(Error,'') not in ('Timeout','Connection Error');
O mejor aún:
Error IS NULL OR Error not in ('Timeout','Connection Error');
O más mejor aún:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
no provoca un cortocircuito, CASE de alguna manera puede provocar un cortocircuito en su consulta
Quizás un ejemplo concreto podría ilustrar por qué NULL NOT IN expression
no devuelve nada:
Dados estos datos: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');
Y haces esta expresión:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
Eso solo generará 'hola'.
El NOT IN se traduce como:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
no se puede determinar, ni siquiera verdadero, ni siquiera falso
NULL <> 'banner'
no se puede determinar, ni siquiera verdadero, ni siquiera falso
Entonces, la expresión de valor nulo, efectivamente resuelta a:
can't be determined AND can't bedetermined
De hecho, si su RDBMS admite boolean en SELECT (por ejemplo, MySQL, Postgresql), puede ver por qué:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
Eso devuelve nulo.
Esto también devuelve nulo:
select null <> 'Bruce' and null <> 'Banner'
Dado que está utilizando NOT IN
, que es básicamente una expresión AND.
NULL AND NULL
Resultados a NULL. Entonces es como si estuvieras haciendo:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
No se devolverá nada