जैसा कि फिल ने उल्लेख किया है, खाली स्ट्रिंग को NULL के रूप में माना जाता है, और NULL किसी भी चीज़ के बराबर या असमान नहीं है। यदि आप खाली स्ट्रिंग्स या NULLs की अपेक्षा करते हैं, तो आपको NVL()
. के साथ उन्हें संभालना होगा :
DECLARE
str1 varchar2(4000);
str2 varchar2(4000);
BEGIN
str1:='';
str2:='sdd';
-- Provide an alternate null value that does not exist in your data:
IF(NVL(str1,'X') != NVL(str2,'Y')) THEN
dbms_output.put_line('The two strings are not equal');
END IF;
END;
/
शून्य तुलनाओं के बारे में:
NULLS पर Oracle 12c प्रलेखन के अनुसार, IS NULL
. का उपयोग करके अशक्त तुलना या IS NOT NULL
TRUE
. का मूल्यांकन करें या FALSE
. हालांकि, अन्य सभी तुलनाओं का मूल्यांकन UNKNOWN
. होता है , नहीं FALSE
. दस्तावेज़ीकरण आगे कहता है:
एक शर्त जो UNKNOWN का मूल्यांकन करती है वह लगभग FALSE की तरह काम करती है। उदाहरण के लिए, WHERE क्लॉज में एक शर्त के साथ एक SELECT स्टेटमेंट जो UNKNOWN का मूल्यांकन करता है, कोई पंक्तियाँ नहीं देता है। हालाँकि, UNKNOWN का मूल्यांकन करने वाली एक शर्त FALSE से भिन्न होती है, जिसमें UNKNOWN स्थिति मूल्यांकन पर आगे के संचालन का मूल्यांकन UNKNOWN पर किया जाएगा। इस प्रकार, NOT FALSE का मूल्यांकन TRUE होता है, लेकिन NOT UNKNOWN का मूल्यांकन UNKNOWN से होता है।
Oracle द्वारा एक संदर्भ तालिका प्रदान की जाती है:
Condition Value of A Evaluation
----------------------------------------
a IS NULL 10 FALSE
a IS NOT NULL 10 TRUE
a IS NULL NULL TRUE
a IS NOT NULL NULL FALSE
a = NULL 10 UNKNOWN
a != NULL 10 UNKNOWN
a = NULL NULL UNKNOWN
a != NULL NULL UNKNOWN
a = 10 NULL UNKNOWN
a != 10 NULL UNKNOWN
मैंने यह भी सीखा कि हमें यह मानकर PL/SQL नहीं लिखना चाहिए कि खाली तार हमेशा NULL के रूप में मूल्यांकन करेंगे:
<ब्लॉककोट>Oracle डेटाबेस वर्तमान में शून्य की लंबाई के साथ एक वर्ण मान को शून्य मानता है। हालांकि, यह भविष्य के रिलीज में सच नहीं हो सकता है, और Oracle अनुशंसा करता है कि आप खाली स्ट्रिंग्स को नल के समान न मानें।