Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que a palavra-chave MYSQL IN não considera valores NULL


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

é semanticamente equivalente a:
Error <> 'TimeOut' AND Error <> 'Connection Error'

As regras sobre comparação nula também se aplicam a IN. Portanto, se o valor de Error for NULL, o banco de dados não poderá tornar a expressão verdadeira.

Para corrigir, você pode fazer isso:
COALESCE(Error,'') not in ('Timeout','Connection Error');

Ou melhor ainda:
Error IS NULL OR Error not in ('Timeout','Connection Error');

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

OR não entra em curto-circuito, o CASE pode de alguma forma causar um curto-circuito na sua consulta

Talvez um exemplo concreto possa ilustrar porque NULL NOT IN expression não retorna nada:

Dados estes dados: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 você faz esta expressão:
select 'hulk' as x, msg, description 
from tbl where msg not in ('bruce','banner');

Isso produzirá apenas 'oi'.

O NOT IN é traduzido como:
select 'hulk' as x, msg, description 
from tbl where msg <> 'bruce' and msg <> 'banner';

NULL <> 'bruce' não pode ser determinado, nem mesmo verdadeiro, nem mesmo falso

NULL <> 'banner' não pode ser determinado, nem mesmo verdadeiro nem mesmo falso

Portanto, a expressão de valor nulo, efetivamente resolvida para:
can't be determined AND can't bedetermined

Na verdade, se o seu RDBMS suporta boolean em SELECT (por exemplo, MySQL, Postgresql), você pode ver o porquê:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce' 

Isso retorna null.

Isso também retorna null:
select null <> 'Bruce' and null <> 'Banner'

Dado que você está usando NOT IN , que é basicamente uma expressão AND.
NULL AND NULL

Resultados para NULL. Então é como se você estivesse fazendo um:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null

Nada será devolvido