To :
Error not in ('Timeout','Connection Error');
jest semantycznie odpowiednikiem:
Error <> 'TimeOut' AND Error <> 'Connection Error'
Zasady dotyczące porównania wartości zerowych dotyczą również IN. Więc jeśli wartość Error wynosi NULL, baza danych nie może sprawić, że wyrażenie będzie prawdziwe.
Aby naprawić, możesz to zrobić:
COALESCE(Error,'') not in ('Timeout','Connection Error');
Albo jeszcze lepiej:
Error IS NULL OR Error not in ('Timeout','Connection Error');
Lub jeszcze lepiej:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
nie powoduje zwarcia, CASE może w jakiś sposób skrócić zapytanie
Być może konkretny przykład może zilustrować, dlaczego NULL NOT IN expression
nic nie zwraca:
Biorąc pod uwagę te dane: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');
I robisz to wyrażenie:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
To wypisze tylko „cześć”.
NOT IN jest tłumaczone jako:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
nie można określić, nawet prawdziwe, nawet fałszywe
NULL <> 'banner'
nie można określić, nawet prawdziwej, ani fałszywej
Tak więc wyrażenie wartości null, efektywnie rozwiązane do:
can't be determined AND can't bedetermined
W rzeczywistości, jeśli twój RDBMS obsługuje wartości logiczne na SELECT (np. MySQL, Postgresql), możesz zobaczyć dlaczego:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
To zwraca wartość null.
To również zwraca wartość null:
select null <> 'Bruce' and null <> 'Banner'
Biorąc pod uwagę, że używasz NOT IN
, który jest zasadniczo wyrażeniem AND.
NULL AND NULL
Wyniki na NULL. To tak, jakbyś robił:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
Nic nie zostanie zwrócone