Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego słowo kluczowe MYSQL IN nie uwzględnia wartości NULL

To :

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

jest semantycznie odpowiednikiem:

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

Zasady dotyczące porównania wartości zerowych dotyczą również IN. Więc jeśli wartość Error wynosi NULL, baza danych nie może sprawić, że wyrażenie będzie prawdziwe.

Aby naprawić, możesz to zrobić:

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

Albo jeszcze lepiej:

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

Lub jeszcze lepiej:

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

OR nie powoduje zwarcia, CASE może w jakiś sposób skrócić zapytanie

Być może konkretny przykład może zilustrować, dlaczego NULL NOT IN expression nic nie zwraca:

Biorąc pod uwagę te dane: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');

I robisz to wyrażenie:

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

To wypisze tylko „cześć”.

NOT IN jest tłumaczone jako:

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

NULL <> 'bruce' nie można określić, nawet prawdziwe, nawet fałszywe

NULL <> 'banner' nie można określić, nawet prawdziwej, ani fałszywej

Tak więc wyrażenie wartości null, efektywnie rozwiązane do:

can't be determined AND can't bedetermined

W rzeczywistości, jeśli twój RDBMS obsługuje wartości logiczne na SELECT (np. MySQL, Postgresql), możesz zobaczyć dlaczego:http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

To zwraca wartość null.

To również zwraca wartość null:

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

Biorąc pod uwagę, że używasz NOT IN , który jest zasadniczo wyrażeniem AND.

NULL AND NULL

Wyniki na NULL. To tak, jakbyś robił:http://www.sqlfiddle.com/# !2/0d5da/12

select * from tbl where null

Nic nie zostanie zwrócone



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 1. rząd w grupie według ostatniego rzędu

  2. Próbuję zbudować statyczną klasę bazy danych, do której mogę uzyskać dostęp z dowolnej funkcji spoza klasy

  3. Najlepszy sposób na zaimplementowanie architektury Klient<->Serwer<-> Bazy danych w aplikacji na Androida?

  4. Jak działa MySQL CASE?

  5. Typ danych MySQL INT(11) podczas gdy UNSIGNED INT(10)?