Questo :
Error not in ('Timeout','Connection Error');
è semanticamente equivalente a:
Error <> 'TimeOut' AND Error <> 'Connection Error'
Le regole sul confronto nullo si applicano anche a IN. Quindi, se il valore di Error è NULL, il database non può rendere true l'espressione.
Per risolvere, potresti fare questo:
COALESCE(Error,'') not in ('Timeout','Connection Error');
O meglio ancora:
Error IS NULL OR Error not in ('Timeout','Connection Error');
O meglio ancora:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
non va in cortocircuito, CASE può in qualche modo cortocircuitare la tua richiesta
Forse un esempio concreto potrebbe illustrare perché NULL NOT IN expression
non restituisce nulla:
Dati questi dati: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 fai questa espressione:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
Questo produrrà solo "ciao".
Il NOT IN è tradotto come:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
non può essere determinato, nemmeno vero, nemmeno falso
NULL <> 'banner'
non può essere determinato, nemmeno vero nemmeno falso
Quindi l'espressione di valore nullo, effettivamente risolta in:
can't be determined AND can't bedetermined
In effetti, se il tuo RDBMS supporta booleano su SELECT (ad es. MySQL, Postgresql), puoi capire perché:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
Ciò restituisce null.
Anche questo restituisce null:
select null <> 'Bruce' and null <> 'Banner'
Dato che stai usando NOT IN
, che è fondamentalmente un'espressione AND.
NULL AND NULL
Risultati a NULL. Quindi è come se stessi facendo un:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
Nulla verrà restituito