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

Hvorfor MYSQL IN-søgeord ikke overvejer NULL-værdier

Dette :

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

er semantisk ækvivalent med:

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

Regler om nul-sammenligning gælder også for IN. Så hvis værdien af ​​Error er NULL, kan databasen ikke gøre udtrykket sandt.

For at rette op, kan du gøre dette:

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

Eller endnu bedre:

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

Eller endnu bedre:

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

OR ikke kortslutter, kan CASE på en eller anden måde kortslutte din forespørgsel

Måske et konkret eksempel kunne illustrere hvorfor NULL NOT IN expression returnerer intet:

Givet disse data: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');

Og du gør dette udtryk:

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

Det vil kun udsende 'hej'.

NOT IN er oversat til:

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

NULL <> 'bruce' kan ikke bestemmes, ikke engang sandt, ikke engang falsk

NULL <> 'banner' kan ikke bestemmes, ikke engang sandt ikke engang falsk

Så nullværdiudtrykket blev effektivt løst til:

can't be determined AND can't bedetermined

Faktisk, hvis din RDBMS understøtter boolean på SELECT(f.eks. MySQL, Postgresql), kan du se hvorfor:http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

Det returnerer null.

Dette returnerer også null:

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

Forudsat at du bruger NOT IN , som dybest set er et OG-udtryk.

NULL AND NULL

Resultater til NULL. Så det er som om du laver en:http://www.sqlfiddle.com/# !2/0d5da/12

select * from tbl where null

Intet vil blive returneret



  1. Hvorfor kan PL/pgSQL-funktioner have bivirkning, mens SQL-funktioner ikke kan?

  2. Hvordan opretter man en procedure i Oracle SQL Developer?

  3. Postgres-funktion returnerer tabel returnerer ikke data i kolonner

  4. Simuler ORDER BY i SQLite UPDATE for at håndtere entydighedsbegrænsning