2013-05-16 7 views
5

निम्नलिखित1 = NULL और 1 के परिणाम क्यों हैं! = समान नहीं? अपेक्षा के अनुरूप</p> <p>

IF 1 = NULL 
    BEGIN 
     SELECT 'A' 
    END 
ELSE 
    BEGIN 
     SELECT 'B' 
    END 

परिणाम बी रिटर्न यहाँ जहां चीजें वास्तव में दिलचस्प

IF 1 != NULL 
    BEGIN 
     SELECT 'A' 
    END 
ELSE 
    BEGIN 
     SELECT 'B' 
    END 

इसके अलावा बी रिटर्न

मिलता है क्यों यह मामला है?

+3

आप 'कुछ नहीं' के बराबर नहीं हो सकते हैं। – sircodesalot

+1

'NULL' कभी भी बराबर नहीं है, बराबर नहीं, किसी भी चीज़ से अधिक या कम। –

+0

वास्तव में? यह बराबर नहीं हो सकता है? –

उत्तर

2

सभी के साथ सहमत हैं जो पहले से ही सहमत हैं। सीधे शब्दों में, एक और कोण से टिप्पणी अगर तुम बंद करने के लिए ansi_nulls सेट करें, जिसका आप प्राप्त कर सकते हैं कि तुम क्या उम्मीद:

अधिक जानकारी पुस्तकें से

set ansi_nulls off 

if 1 = null 
    select 'a' 
else 
    select 'b' -- Returned 


if 1 != null 
    select 'a' -- Returned 
else 
    select 'b' 
ऑनलाइन:

जब सेट ANSI_NULLS बंद है, बराबर (=) और बराबर नहीं (<>) तुलना ऑपरेटर आईएसओ मानक का पालन नहीं करते हैं। एक चयन कथन जो WHERE column_name = NULL का उपयोग करता है पंक्तियों को वापस करता है कॉलम_नाम में शून्य मान हैं। एक SELECT कथन जो WHERE कॉलम_नाम <> NULL उन पंक्तियों को वापस करता है जिनमें कॉलम में nonnull मान नहीं हैं। साथ ही, एक SELECT कथन जो WHERE column_name <> XYZ_value का उपयोग करता है उन सभी पंक्तियों को वापस करता है जो XYZ_value नहीं हैं और NULL नहीं हैं।

यह ansi_nulls off समझाया गया है।

एसक्यूएल सर्वर के भविष्य के संस्करण में, ANSI_NULLS हमेशा पर और कोई भी एप्लिकेशन जिसे स्पष्ट रूप से बंद करने के लिए विकल्प एक त्रुटि उत्पन्न होगा सेट हो जाएगा: हालांकि, बस इसे बंद करने की वजह से की कोशिश नहीं करते। इस सुविधा का उपयोग नए विकास कार्यों में करने से बचें, और इस सुविधा का उपयोग करने वाले अनुप्रयोगों को संशोधित करने के लिए योजना बनाएं।

नीचे सिफारिश बजाय का पालन करें:

के रूप में इरादा एक स्क्रिप्ट काम करने के लिए, ANSI_NULLS डेटाबेस विकल्प या सेट ANSI_NULLS की सेटिंग कुछ भी हो लिए, उपयोग शून्य है और तुलना में शून्य नहीं है इसमें शून्य मान हो सकते हैं।

if 1 is null 
    select 'a' 
else 
    select 'b' -- Returned 


if 1 is not null 
    select 'a' -- Returned 
else 
    select 'b' 
7

न तो IF कथन सत्य है। NULL न तो कुछ के बराबर है और न ही किसी के बराबर है। कुछ या तो IS NULL या IS NOT NULL

0

मुझे लगता है कि न्यूल निर्दिष्ट है कि यह एक तरह से, <,>, =,! = ऑपरेटरों द्वारा असामान्य है। ऐसी तुलना शायद कुल लौटाती है। फिर if(NULL) प्रसंस्करण छोड़ दिया गया है।

1

आप NULL = NULL की तुलना नहीं कर सकते - इसका कोई मूल्य नहीं है।

SELECT 1 
WHERE NULL = NULL 

कुछ भी

वापस नहीं करता है जब की तुलना NULL मूल्यों IS का उपयोग नहीं =

SELECT 1 
WHERE NULL IS NULL 

Reuturns 1

MSDN से:

यह निर्धारित करने के लिए कि कोई अभिव्यक्ति पूर्ण है या नहीं, तुलनात्मक ऑपरेटरों (जैसे = या! =) की बजाय IS NULL या NULL नहीं है। तुलना ऑपरेटर UNKNOWN लौटते हैं यदि दोनों या दोनों तर्क न्यूल हैं।

http://msdn.microsoft.com/en-us/library/aa933227

1

यह आसान है।

(1 = NULL) IS UNKNOWN 
(1 <> NULL) IS UNKNOWN 
(1 + NULL) IS UNKNOWN 
(1 * NULL) IS UNKNOWN 

इसलिए, दोनों ही मामलों में आप किसी और शाखा में खत्म हो: एएनएसआई संदर्भ में, किसी भी अभिव्यक्ति (तार्किक या अंकगणितीय) शून्य से जुड़े अज्ञात परिणाम है।

अधिक स्पष्टीकरण के लिए this लिंक का प्रयास करें।

+1

आपके लिंक से _... UNKNOWN_ के मूल्यांकन के शून्य मूल्य के विरुद्ध सभी तुलना सही करने के लिए आपकी प्रतिक्रिया संपादित करेंगी। –

+0

@ShannonSeverance यह बेहतर लगता है। आप SELECT 1 = NULL से पूछ नहीं सकते - यह पार्सिंग में विफल रहता है। मुझे आपकी टिप्पणी याद आएगी। –

+0

शब्दावली उलझन में है। पीएल/एसक्यूएल में एक बूलियन डेटाटाइप है। बूलियन तीन मान ले सकते हैं: 'सत्य', 'झूठा' और 'शून्य'। –

2

यह है न के बराबर है और न ही NULL के लिए नहीं-बराबर क्योंकि NULL एक बात लेकिन, वास्तव में, एक बात के अभाव नहीं है।

एएनएसआई एसक्यूएल 1999 (अभी तक एमएसएसक्यूएल नहीं) में IS [NOT] DISTINCT FROM नामक एक विधि शामिल है जिसका उपयोग NULL पर किया जा सकता है जिसके परिणाम आप उम्मीद कर सकते हैं।

How to rewrite IS DISTINCT FROM and IS NOT DISTINCT FROM?

यहाँ IS DISTINCT FROM व्यवहार पर एक उत्कृष्ट पोस्ट और Itzik बेन-गण

http://sqlmag.com/sql-server/not-distinct

द्वारा सामान्य रूप में NULL की भ्रामक प्रकृति है विधेय, सही गलत या करने के लिए मूल्यांकन कर सकते हैं अनजान। जब भी एनयूएल शामिल होते हैं तो भविष्यवाणी UNKNOWN का मूल्यांकन करती है।

यहाँ Erland Sommarskog इसके लिए बधाई देने के लिए किया जाता है:

http://www.sommarskog.se/wishlist.html#isdistinctfrom

एसक्यूएल: 1999 को परिभाषित करता है ऑपरेटरों क्रमशः से अलग है और अलग नहीं है जहाँ से < जैसे ही हैं> और =, सिवाय इसके कि वे नल मूल्यों पर भी लागू होते हैं।

http://connect.microsoft.com/SQLServer/feedback/details/286422/add-language-and-optimizer-support-for-iso-distinct-predicate

यह एक आम आवश्यकता है, लेकिन कई स्तंभों के लिए इस कोडिंग दोनों कठिन है:

(Erland से) यहाँ एमवीपी स्टीव Kass के लिए कनेक्ट पर एक लिंक सुविधा का अनुरोध है और त्रुटि-प्रवण (विशेष रूप से एंड/या प्राथमिकता के कारण)। ANSI_NULLS की सेटिंग बदलना एक समाधान नहीं है, क्योंकि यह कॉलम-टू-कॉलम तुलना को प्रभावित नहीं करता है, केवल परिवर्तनीय तुलना के लिए कॉलम। ANSI_NULLS को बंद करना भी गैर-मानक है और एक क्वेरी में विशिष्ट तुलनाओं पर लागू करने के लिए पर्याप्त नहीं है।

संबंधित मुद्दे