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