Toto :
Error not in ('Timeout','Connection Error');
je sémanticky ekvivalentní:
Error <> 'TimeOut' AND Error <> 'Connection Error'
Pravidla o nulovém porovnávání platí i pro IN. Pokud je tedy hodnota Error NULL, databáze nemůže uvést výraz jako pravdivý.
Chcete-li to opravit, můžete provést toto:
COALESCE(Error,'') not in ('Timeout','Connection Error');
Nebo ještě lépe:
Error IS NULL OR Error not in ('Timeout','Connection Error');
Nebo ještě lépe:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
nezkratuje, CASE může nějak zkratovat váš dotaz
Možná by konkrétní příklad mohl ilustrovat, proč NULL NOT IN expression
nevrací nic:
Vzhledem k těmto údajům: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');
A uděláte tento výraz:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
Výsledkem bude pouze 'hi'.
NOT IN je přeloženo jako:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
nelze určit, dokonce ani pravdivé, dokonce ani nepravdivé
NULL <> 'banner'
nelze určit, dokonce ani pravdivé, dokonce ani nepravdivé
Takže výraz nulové hodnoty, efektivně vyřešen na:
can't be determined AND can't bedetermined
Ve skutečnosti, pokud vaše RDBMS podporuje boolean na SELECT (např. MySQL, Postgresql), můžete vidět proč:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
To vrátí hodnotu null.
To také vrátí hodnotu null:
select null <> 'Bruce' and null <> 'Banner'
Vzhledem k tomu, že používáte NOT IN
, což je v podstatě výraz AND.
NULL AND NULL
Výsledky na NULL. Je to jako byste dělali:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
Nic nebude vráceno