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