sql >> Databáze >  >> RDS >> Mysql

Proč klíčové slovo MYSQL IN nebere v úvahu hodnoty NULL

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



  1. GROUP BY pro souvislé řádky v SQL

  2. divné - výjimka mysql sql::SQLException není zachycena svým typem, ale je zachycena jako std::exception a úspěšně odevzdávána zpět

  3. Jak změníte datový typ sloupce na serveru SQL?

  4. Znamená omezení Postgres UNIQUE index?