Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tại sao từ khóa MYSQL IN không xem xét các giá trị NULL

Cái này:

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

tương đương về mặt ngữ nghĩa với:

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

Các quy tắc về so sánh rỗng cũng áp dụng cho IN. Vì vậy, nếu giá trị của Lỗi là NULL, cơ sở dữ liệu không thể làm cho biểu thức đúng.

Để khắc phục, bạn có thể làm như sau:

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

Hoặc tốt hơn:

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

Hoặc tốt hơn nữa:

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

OR không ngắn mạch, CASE bằng cách nào đó có thể làm ngắn mạch truy vấn của bạn

Có lẽ một ví dụ cụ thể có thể minh họa tại sao biểu thức NULL NOT IN expression không trả lại gì:

Với dữ liệu này: 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');

Và bạn thực hiện biểu thức này:

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

Điều đó sẽ chỉ xuất ra 'hi'.

NOT IN được dịch là:

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

NULL <> 'bruce' không thể xác định được, thậm chí không đúng, thậm chí không sai

NULL <> 'banner' không thể xác định được, thậm chí không đúng thậm chí không sai

Vì vậy, biểu thức giá trị null, được giải quyết một cách hiệu quả thành:

can't be determined AND can't bedetermined

Trên thực tế, nếu RDBMS của bạn hỗ trợ boolean trên SELECT (ví dụ:MySQL, Postgresql), bạn có thể hiểu tại sao: http://www.sqlfiddle.com/#!2/d41d8/828

select null <> 'Bruce' 

Điều đó trả về null.

Điều này cũng trả về null:

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

Giả sử bạn đang sử dụng NOT IN , về cơ bản là một biểu thức AND.

NULL AND NULL

Kết quả đến NULL. Vì vậy, nó giống như bạn đang thực hiện: http://www.sqlfiddle.com/# ! 2 / 0d5da / 12

select * from tbl where null

Không có gì sẽ được trả lại



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysqli nhiều truy vấn - biến set tạo ra lỗi boolean / làm thế nào để bỏ qua điều này?

  2. Cách xuất dữ liệu từ SQL Server 2005 sang MySQL

  3. Truy vấn MySQL trở nên hoang dã?

  4. Làm cách nào để lưu trữ tệp .pdf vào MySQL dưới dạng BLOB bằng PHP?

  5. Phạm vi giới hạn của MySQL