sql >> Databasteknik >  >> RDS >> Mysql

Varför MYSQL IN-nyckelordet inte beaktar NULL-värden

Detta :

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

är semantiskt ekvivalent med:

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

Regler om nolljämförelse gäller även för IN. Så om värdet på Error är NULL, kan databasen inte göra uttrycket sant.

För att fixa kan du göra så här:

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

Eller ännu bättre:

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

Eller ännu bättre:

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

OR inte kortsluter, kan CASE på något sätt kortsluta din fråga

Kanske ett konkret exempel skulle kunna illustrera varför NULL NOT IN expression returnerar ingenting:

Med tanke på dessa uppgifter: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');

Och du gör det här uttrycket:

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

Det kommer bara att mata ut "hej".

NOT IN översätts som:

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

NULL <> 'bruce' kan inte fastställas, inte ens sant, inte ens falskt

NULL <> 'banner' kan inte fastställas, inte ens sant inte ens falskt

Så nullvärdeuttrycket löstes effektivt till:

can't be determined AND can't bedetermined

Faktum är att om din RDBMS stöder boolean på SELECT(t.ex. MySQL, Postgresql), kan du se varför:http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

Det returnerar null.

Detta returnerar också null:

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

Förutsatt att du använder NOT IN , som i grunden är ett OCH-uttryck.

NULL AND NULL

Resultat till NULL. Så det är som att du gör en:http://www.sqlfiddle.com/# !2/0d5da/12

select * from tbl where null

Ingenting kommer att returneras



  1. Gå med i Q&A Forum för utvecklare

  2. Hur man lägger till rankningspositioner till rader med DENSE_RANK() i SQL

  3. drupal sql villkorliga klausuler för flera tabeller?

  4. Att hämta UTF-8-text från MySQL i R returnerar ????