Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa kata kunci MYSQL IN tidak mempertimbangkan nilai NULL

Ini :

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

secara semantik setara dengan:

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

Aturan tentang perbandingan nol juga berlaku untuk IN. Jadi jika nilai Error adalah NULL, database tidak dapat membuat ekspresi menjadi benar.

Untuk memperbaikinya, Anda dapat melakukan ini:

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

Atau lebih baik lagi:

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

Atau lebih baik lagi:

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

OR tidak menyebabkan hubungan arus pendek, CASE entah bagaimana dapat menyebabkan hubungan arus pendek permintaan Anda

Mungkin contoh konkret dapat menggambarkan mengapa ekspresi NULL NOT IN expression tidak menghasilkan apa-apa:

Diberikan data ini: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');

Dan Anda melakukan ekspresi ini:

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

Itu hanya akan menampilkan 'hai'.

NOT IN diterjemahkan sebagai:

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

NULL <> 'bruce' tidak dapat ditentukan, bahkan tidak benar, bahkan tidak salah

NULL <> 'banner' tidak dapat ditentukan, bahkan tidak benar bahkan tidak salah

Jadi ekspresi nilai nol, secara efektif diselesaikan menjadi:

can't be determined AND can't bedetermined

Faktanya, jika RDBMS Anda mendukung boolean di SELECT (mis. MySQL, Postgresql), Anda dapat melihat alasannya:http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

Itu mengembalikan nol.

Ini mengembalikan null juga:

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

Mengingat Anda menggunakan NOT IN , yang pada dasarnya adalah ekspresi AND.

NULL AND NULL

Hasil menjadi NULL. Jadi seperti Anda melakukan:http://www.sqlfiddle.com/# !2/0d5da/12

select * from tbl where null

Tidak ada yang akan dikembalikan



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Daftar tarik-turun dinamis untuk berbagai negara, negara bagian, lokasi geografis?

  2. Cara menggunakan cPanel MySQL Database Wizard

  3. auto_increment menurut grup

  4. server WAMP. Direktori data yang sangat besar di MySQL?

  5. Apa arti kata kunci KUNCI?