Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо ключовата дума MYSQL IN не отчита NULL стойности

Това :

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

е семантично еквивалентен на:

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

Правилата за нулево сравнение се отнасят и за IN. Така че, ако стойността на Error е NULL, базата данни не може да направи израза верен.

За да коригирате, можете да направите това:

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

Или още по-добре:

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

Или още по-добре:

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

OR не създава късо съединение, CASE може по някакъв начин да осъществи късо съединение на вашата заявка

Може би конкретен пример би могъл да илюстрира защо NULL NOT IN expression не връща нищо:

Предвид тези данни: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');

И вие правите този израз:

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

Това ще изведе само „здравей“.

NOT IN се превежда като:

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

NULL <> 'bruce' не може да се определи, нито е вярно, нито дори невярно

NULL <> 'banner' не може да се определи, дори не е вярно, дори невярно

Така изразът с нулева стойност, ефективно разрешен до:

can't be determined AND can't bedetermined

Всъщност, ако вашата RDBMS поддържа булева на SELECT (напр. MySQL, Postgresql), можете да видите защо:http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

Това връща нула.

Това също връща null:

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

Като се има предвид, че използвате NOT IN , което по същество е израз И.

NULL AND NULL

Резултати до NULL. Така че сякаш правите:http://www.sqlfiddle.com/# !2/0d5da/12

select * from tbl where null

Нищо няма да бъде върнато



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL дата или PHP час?

  2. Изчислете разликата във времето между два реда

  3. PHP PDO:набор от знаци, имена на набори?

  4. Yii2:Kartik Gridview сума от колона в долния колонтитул

  5. Квалифициране на име на колона на временна таблица в jOOQ