Това :
Error not in ('Timeout','Connection Error');
е семантично еквивалентен на:
Error <> 'TimeOut' AND Error <> 'Connection Error'
Правилата за нулево сравнение се отнасят и за 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'
не може да се определи, дори не е вярно, дори невярно
Така изразът с нулева стойност, ефективно разрешен до:
can't be determined AND can't bedetermined
Всъщност, ако вашата RDBMS поддържа булева на SELECT (напр. MySQL, Postgresql), можете да видите защо:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
Това връща нула.
Това също връща null:
select null <> 'Bruce' and null <> 'Banner'
Като се има предвид, че използвате NOT IN
, което по същество е израз И.
NULL AND NULL
Резултати до NULL. Така че сякаш правите:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
Нищо няма да бъде върнато