sql >> Database >  >> RDS >> Mysql

Waarom MYSQL IN-sleutelwoord geen NULL-waarden in overweging neemt?

Dit :

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

is semantisch gelijk aan:

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

Regels over nulvergelijking zijn ook van toepassing op IN. Dus als de waarde van Error NULL is, kan de database de expressie niet waar maken.

Om dit op te lossen, kunt u dit doen:

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

Of beter nog:

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

Of nog beter:

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

OR maakt geen kortsluiting, CASE kan uw vraag op de een of andere manier kortsluiten

Misschien kan een concreet voorbeeld illustreren waarom NULL NOT IN expression geeft niets terug:

Gezien deze gegevens: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');

En je doet deze uitdrukking:

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

Dat geeft alleen 'hi' weer.

De NOT IN wordt vertaald als:

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

NULL <> 'bruce' kan niet worden bepaald, zelfs niet waar, zelfs niet onwaar

NULL <> 'banner' kan niet worden bepaald, zelfs niet waar, zelfs niet onwaar

Dus de null-waarde-expressie, effectief opgelost in:

can't be determined AND can't bedetermined

Als je RDBMS boolean ondersteunt op SELECT (bijv. MySQL, Postgresql), kun je zien waarom:http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

Dat levert nul op.

Dit retourneert ook null:

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

Aangezien u NOT IN gebruikt , wat in feite een AND-expressie is.

NULL AND NULL

Resultaten naar NULL. Het is dus alsof je een:http://www.sqlfiddle.com/# doet !2/0d5da/12

select * from tbl where null

Er wordt niets geretourneerd



  1. Hoe current_time werkt in PostgreSQL

  2. Aangepaste numerieke notatietekenreeksen ondersteund door FORMAT() in SQL Server

  3. Dagelijkse databaseback-up met behulp van Cron Job

  4. Hoe SQL Server op Windows te installeren