यह:
Error not in ('Timeout','Connection Error');
शब्दार्थ के बराबर है:
Error <> 'TimeOut' AND Error <> 'Connection Error'
शून्य तुलना के नियम IN पर भी लागू होते हैं। इसलिए यदि Error का मान NULL है, तो डेटाबेस व्यंजक को सत्य नहीं बना सकता।
ठीक करने के लिए, आप यह कर सकते हैं:
COALESCE(Error,'') not in ('Timeout','Connection Error');
या बेहतर अभी तक:
Error IS NULL OR Error not in ('Timeout','Connection Error');
या इससे भी बेहतर:
CASE WHEN Error IS NULL THEN 1
ELSE Error not in ('Timeout','Connection Error') THEN 1
END = 1
OR
शॉर्ट-सर्किट नहीं करता, CASE किसी तरह आपकी क्वेरी को शॉर्ट-सर्किट कर सकता है
शायद एक ठोस उदाहरण यह बता सकता है कि क्यों NULL NOT IN expression
कुछ नहीं लौटाता:
इस डेटा को देखते हुए: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');
और आप यह अभिव्यक्ति करते हैं:
select 'hulk' as x, msg, description
from tbl where msg not in ('bruce','banner');
वह केवल 'हाय' आउटपुट करेगा।
NOT IN का अनुवाद इस प्रकार किया जाता है:
select 'hulk' as x, msg, description
from tbl where msg <> 'bruce' and msg <> 'banner';
NULL <> 'bruce'
निर्धारित नहीं किया जा सकता, सत्य भी नहीं, असत्य भी नहीं
NULL <> 'banner'
निर्धारित नहीं किया जा सकता, सत्य भी नहीं झूठ भी नहीं
तो शून्य मान अभिव्यक्ति, प्रभावी ढंग से हल की गई:
can't be determined AND can't bedetermined
वास्तव में, यदि आपका RDBMS SELECT (जैसे MySQL, Postgresql) पर बूलियन का समर्थन करता है, तो आप देख सकते हैं कि क्यों:http://www.sqlfiddle.com/#!2/d41d8/828
select null <> 'Bruce'
वह शून्य लौटाता है।
यह शून्य भी लौटाता है:
select null <> 'Bruce' and null <> 'Banner'
यह देखते हुए कि आप NOT IN
. का उपयोग कर रहे हैं , जो मूल रूप से एक AND अभिव्यक्ति है।
NULL AND NULL
परिणाम शून्य के लिए। तो यह ऐसा है जैसे आप एक कर रहे हैं:http://www.sqlfiddle.com/# !2/0d5da/12
select * from tbl where null
कुछ भी वापस नहीं किया जाएगा