Mysql
 sql >> Database >  >> RDS >> Mysql

Perché la parola chiave MYSQL IN non considera i valori NULL

Questo :

Error not in ('Timeout','Connection Error');

è semanticamente equivalente a:

Error <> 'TimeOut' AND Error <> 'Connection Error'

Le regole sul confronto nullo si applicano anche a IN. Quindi, se il valore di Error è NULL, il database non può rendere true l'espressione.

Per risolvere, potresti fare questo:

COALESCE(Error,'') not in ('Timeout','Connection Error');

O meglio ancora:

Error IS NULL OR Error not in ('Timeout','Connection Error');

O meglio ancora:

 CASE WHEN Error IS NULL THEN 1
 ELSE Error not in ('Timeout','Connection Error') THEN 1
 END = 1

OR non va in cortocircuito, CASE può in qualche modo cortocircuitare la tua richiesta

Forse un esempio concreto potrebbe illustrare perché NULL NOT IN expression non restituisce nulla:

Dati questi dati: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');

E fai questa espressione:

select 'hulk' as x, msg, description 
from tbl where msg not in ('bruce','banner');

Questo produrrà solo "ciao".

Il NOT IN è tradotto come:

select 'hulk' as x, msg, description 
from tbl where msg <> 'bruce' and msg <> 'banner';

NULL <> 'bruce' non può essere determinato, nemmeno vero, nemmeno falso

NULL <> 'banner' non può essere determinato, nemmeno vero nemmeno falso

Quindi l'espressione di valore nullo, effettivamente risolta in:

can't be determined AND can't bedetermined

In effetti, se il tuo RDBMS supporta booleano su SELECT (ad es. MySQL, Postgresql), puoi capire perché:http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

Ciò restituisce null.

Anche questo restituisce null:

select null <> 'Bruce' and null <> 'Banner'

Dato che stai usando NOT IN , che è fondamentalmente un'espressione AND.

NULL AND NULL

Risultati a NULL. Quindi è come se stessi facendo un:http://www.sqlfiddle.com/# !2/0d5da/12

select * from tbl where null

Nulla verrà restituito