Dette :
Error not in ('Timeout','Connection Error');
er semantisk ækvivalent med:
Error <> 'TimeOut' AND Error <> 'Connection Error'
Regler om nul-sammenligning gælder også for IN. Så hvis værdien af Error er NULL, kan databasen ikke gøre udtrykket sandt.
For at rette op, kan du gøre dette:
COALESCE(Error,'') not in ('Timeout','Connection Error');
Eller endnu bedre:
Error IS NULL OR Error not in ('Timeout','Connection Error');
Eller endnu bedre:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
ikke kortslutter, kan CASE på en eller anden måde kortslutte din forespørgsel
Måske et konkret eksempel kunne illustrere hvorfor NULL NOT IN expression
returnerer intet:
Givet disse data: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');
Og du gør dette udtryk:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
Det vil kun udsende 'hej'.
NOT IN er oversat til:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
kan ikke bestemmes, ikke engang sandt, ikke engang falsk
NULL <> 'banner'
kan ikke bestemmes, ikke engang sandt ikke engang falsk
Så nullværdiudtrykket blev effektivt løst til:
can't be determined AND can't bedetermined
Faktisk, hvis din RDBMS understøtter boolean på SELECT(f.eks. MySQL, Postgresql), kan du se hvorfor:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
Det returnerer null.
Dette returnerer også null:
select null <> 'Bruce' and null <> 'Banner'
Forudsat at du bruger NOT IN
, som dybest set er et OG-udtryk.
NULL AND NULL
Resultater til NULL. Så det er som om du laver en:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
Intet vil blive returneret