Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum das Schlüsselwort MYSQL IN keine NULL-Werte berücksichtigt

Dies:

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

ist semantisch äquivalent zu:

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

Die Regeln zum Nullvergleich gelten auch für IN. Wenn also der Wert von Error NULL ist, kann die Datenbank den Ausdruck nicht wahr machen.

Um das Problem zu beheben, können Sie Folgendes tun:

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

Oder noch besser:

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

Oder noch besser:

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

OR nicht kurzschließt, CASE kann Ihre Anfrage irgendwie kurzschließen

Vielleicht könnte ein konkretes Beispiel verdeutlichen, warum NULL NOT IN expression gibt nichts zurück:

Angesichts dieser Daten: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');

Und Sie machen diesen Ausdruck:

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

Das gibt nur 'hi' aus.

Das NOT IN wird übersetzt als:

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

NULL <> 'bruce' kann nicht bestimmt werden, nicht einmal wahr, nicht einmal falsch

NULL <> 'banner' kann nicht bestimmt werden, nicht einmal wahr, nicht einmal falsch

Also der Nullwertausdruck, effektiv aufgelöst zu:

can't be determined AND can't bedetermined

Wenn Ihr RDBMS boolesche Werte bei SELECT unterstützt (z. B. MySQL, Postgresql), können Sie sehen, warum:http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

Das gibt null zurück.

Dies gibt auch null zurück:

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

Vorausgesetzt, Sie verwenden NOT IN , was im Grunde ein UND-Ausdruck ist.

NULL AND NULL

Ergebnisse auf NULL. Es ist also so, als würden Sie Folgendes tun:http://www.sqlfiddle.com/# !2/0d5da/12

select * from tbl where null

Es wird nichts zurückgegeben