sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué la palabra clave MYSQL IN no considera valores NULL?

Esto:

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

es semánticamente equivalente a:

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

Las reglas sobre la comparación nula también se aplican a IN. Entonces, si el valor de Error es NULL, la base de datos no puede hacer que la expresión sea verdadera.

Para solucionarlo, podría hacer esto:

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

O mejor aún:

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

O más mejor aún:

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

OR no provoca un cortocircuito, CASE de alguna manera puede provocar un cortocircuito en su consulta

Quizás un ejemplo concreto podría ilustrar por qué NULL NOT IN expression no devuelve nada:

Dados estos datos: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');

Y haces esta expresión:

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

Eso solo generará 'hola'.

El NOT IN se traduce como:

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

NULL <> 'bruce' no se puede determinar, ni siquiera verdadero, ni siquiera falso

NULL <> 'banner' no se puede determinar, ni siquiera verdadero, ni siquiera falso

Entonces, la expresión de valor nulo, efectivamente resuelta a:

can't be determined AND can't bedetermined

De hecho, si su RDBMS admite boolean en SELECT (por ejemplo, MySQL, Postgresql), puede ver por qué:http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

Eso devuelve nulo.

Esto también devuelve nulo:

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

Dado que está utilizando NOT IN , que es básicamente una expresión AND.

NULL AND NULL

Resultados a NULL. Entonces es como si estuvieras haciendo:http://www.sqlfiddle.com/# !2/0d5da/12

select * from tbl where null

No se devolverá nada