Dit :
Error not in ('Timeout','Connection Error');
is semantisch gelijk aan:
Error <> 'TimeOut' AND Error <> 'Connection Error'
Regels over nulvergelijking zijn ook van toepassing op IN. Dus als de waarde van Error NULL is, kan de database de expressie niet waar maken.
Om dit op te lossen, kunt u dit doen:
COALESCE(Error,'') not in ('Timeout','Connection Error');
Of beter nog:
Error IS NULL OR Error not in ('Timeout','Connection Error');
Of nog beter:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
maakt geen kortsluiting, CASE kan uw vraag op de een of andere manier kortsluiten
Misschien kan een concreet voorbeeld illustreren waarom NULL NOT IN expression
geeft niets terug:
Gezien deze gegevens: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');
En je doet deze uitdrukking:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
Dat geeft alleen 'hi' weer.
De NOT IN wordt vertaald als:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
kan niet worden bepaald, zelfs niet waar, zelfs niet onwaar
NULL <> 'banner'
kan niet worden bepaald, zelfs niet waar, zelfs niet onwaar
Dus de null-waarde-expressie, effectief opgelost in:
can't be determined AND can't bedetermined
Als je RDBMS boolean ondersteunt op SELECT (bijv. MySQL, Postgresql), kun je zien waarom:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
Dat levert nul op.
Dit retourneert ook null:
select null <> 'Bruce' and null <> 'Banner'
Aangezien u NOT IN
gebruikt , wat in feite een AND-expressie is.
NULL AND NULL
Resultaten naar NULL. Het is dus alsof je een:http://www.sqlfiddle.com/# doet !2/0d5da/12
select * from tbl where null
Er wordt niets geretourneerd