Detta :
Error not in ('Timeout','Connection Error');
är semantiskt ekvivalent med:
Error <> 'TimeOut' AND Error <> 'Connection Error'
Regler om nolljämförelse gäller även för IN. Så om värdet på Error är NULL, kan databasen inte göra uttrycket sant.
För att fixa kan du göra så här:
COALESCE(Error,'') not in ('Timeout','Connection Error');
Eller ännu bättre:
Error IS NULL OR Error not in ('Timeout','Connection Error');
Eller ännu bättre:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
inte kortsluter, kan CASE på något sätt kortsluta din fråga
Kanske ett konkret exempel skulle kunna illustrera varför NULL NOT IN expression
returnerar ingenting:
Med tanke på dessa uppgifter: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');
Och du gör det här uttrycket:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
Det kommer bara att mata ut "hej".
NOT IN översätts som:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
kan inte fastställas, inte ens sant, inte ens falskt
NULL <> 'banner'
kan inte fastställas, inte ens sant inte ens falskt
Så nullvärdeuttrycket löstes effektivt till:
can't be determined AND can't bedetermined
Faktum är att om din RDBMS stöder boolean på SELECT(t.ex. MySQL, Postgresql), kan du se varför:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
Det returnerar null.
Detta returnerar också null:
select null <> 'Bruce' and null <> 'Banner'
Förutsatt att du använder NOT IN
, som i grunden är ett OCH-uttryck.
NULL AND NULL
Resultat till NULL. Så det är som att du gör en:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
Ingenting kommer att returneras