Dies:
Error not in ('Timeout','Connection Error');
ist semantisch äquivalent zu:
Error <> 'TimeOut' AND Error <> 'Connection Error'
Die Regeln zum Nullvergleich gelten auch für IN. Wenn also der Wert von Error NULL ist, kann die Datenbank den Ausdruck nicht wahr machen.
Um das Problem zu beheben, können Sie Folgendes tun:
COALESCE(Error,'') not in ('Timeout','Connection Error');
Oder noch besser:
Error IS NULL OR Error not in ('Timeout','Connection Error');
Oder noch besser:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
nicht kurzschließt, CASE kann Ihre Anfrage irgendwie kurzschließen
Vielleicht könnte ein konkretes Beispiel verdeutlichen, warum NULL NOT IN expression
gibt nichts zurück:
Angesichts dieser Daten: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');
Und Sie machen diesen Ausdruck:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
Das gibt nur 'hi' aus.
Das NOT IN wird übersetzt als:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
kann nicht bestimmt werden, nicht einmal wahr, nicht einmal falsch
NULL <> 'banner'
kann nicht bestimmt werden, nicht einmal wahr, nicht einmal falsch
Also der Nullwertausdruck, effektiv aufgelöst zu:
can't be determined AND can't bedetermined
Wenn Ihr RDBMS boolesche Werte bei SELECT unterstützt (z. B. MySQL, Postgresql), können Sie sehen, warum:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
Das gibt null zurück.
Dies gibt auch null zurück:
select null <> 'Bruce' and null <> 'Banner'
Vorausgesetzt, Sie verwenden NOT IN
, was im Grunde ein UND-Ausdruck ist.
NULL AND NULL
Ergebnisse auf NULL. Es ist also so, als würden Sie Folgendes tun:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
Es wird nichts zurückgegeben