दिलचस्प पोस्ट
अप्रचलित चेतावनी: पल निर्माण जेएस दिनांक पर वापस गिर जाता है NumPy सरणी JSON धारावाहिक नहीं है मैं कोणीय की घटनाओं का परीक्षण कैसे कर सकता हूं? पायथन: mysqldb को एक शब्दकोश के रूप में एक MySQL तालिका आयात करने के लिए उपयोग करें? कैप्चा का उपयोग किए बिना टिप्पणी स्पैम अवरुद्ध एकल-विधानसभा बहुभाषी विंडोज़ फार्म तैनाती (आईएलएमर्गे और सैटेलाइट असेंबली / स्थानीयकरण) – संभव है? सी # में मौन असफलता, ऐसा प्रतीत होता है कि अप्रचलित अपवाद जो प्रोग्राम को क्रैश नहीं करता ज़ेरस के साथ एक स्ट्रिंग वाला बायां पैडिंग जावा में क्लास एट्रिब्यूट्स पर लूप कैसे करें? काम करने के लिए कार्यवाही में खोजदृश्य नहीं मिल सकता है Google OAuth 2 प्राधिकरण – त्रुटि: redirect_uri_mismatch घुमाओ JToolbar बटन दबाने GMail PHP API के साथ ईमेल का मुख्य भाग नहीं मिल सकता है MySQL पर @ जनरेटेड वैल्यू बहुरूपिक सार सुपरक्लास "आधुनिक" रेगेक्सस की मान्यता शक्ति

क्यों नल रिक्त झूठी के बराबर नहीं है

मैं इस लेख को पढ़ रहा था: SQL में नल == नल प्राप्त करें

और आम सहमति यह है कि जब दो (शून्य) वर्ग के स्तंभों के बीच समानता का परीक्षण करने का प्रयास करते हैं, तो सही दृष्टिकोण है:

where ((A=B) OR (A IS NULL AND B IS NULL)) 

जब ए और बी नाल होते हैं, (ए = बी) अभी भी गलत होता है, क्योंकि शून्य नल के बराबर नहीं है। यही कारण है कि अतिरिक्त चेक की आवश्यकता है।

असमानताओं का परीक्षण करते समय के बारे में क्या? उपर्युक्त चर्चा के बाद, मुझे यह सोचने लगा कि असमानता का परीक्षण करने के लिए मुझे कुछ ऐसा करना होगा:

 WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL)) 

हालांकि, मैंने पाया कि यह जरूरी नहीं है (कम से कम सूचना 11.5 पर नहीं), और मैं बस कर सकता हूँ:

 where (A<>B) 

यदि ए और बी नाल हैं, तो यह गलत हो जाता है यदि शून्य नल के बराबर नहीं है, तो क्या यह सही नहीं होगा?

संपादित करें
ये सभी अच्छे उत्तर हैं, लेकिन मुझे लगता है कि मेरा सवाल थोड़ा अस्पष्ट था। मुझे फिर से रेफ्रेज़ करने की अनुमति दें:

यह देखते हुए कि ए या बी नल हो सकता है, यह उनकी असमानता को जांचने के लिए पर्याप्त है

 where (A<>B) 

या मुझे इस तरह स्पष्ट रूप से जांचना होगा:

 WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL)) 

इस प्रश्न के उत्तर के लिए इस थ्रेड को रेफर करें।

वेब के समाधान से एकत्रित समाधान "क्यों नल रिक्त झूठी के बराबर नहीं है"

नल से जुड़े रिलेशनल एक्सप्रेशंस वास्तव में फिर से नल का इस्तेमाल करते हैं

संपादित करें

यहां, <> मनमानी द्विआधारी ऑपरेटर के लिए खड़ा है, NULL एसक्यूएल प्लेसहोल्डर है, और value किसी भी मान है ( NULL एक मान नहीं है):

  • NULL <> value -> NULL
  • NULL <> NULL -> NULL

तर्क है: NULL "कोई मूल्य नहीं" या "अज्ञात मूल्य" का अर्थ है, और इस प्रकार किसी भी वास्तविक मूल्य के साथ कोई तुलना कोई मतलब नहीं है।

X = 42 सच है, गलत, या अज्ञात है, यह देखते हुए कि आप नहीं जानते हैं कि मूल्य क्या है (यदि कोई है ) X धारण करता है? एसक्यूएल कहते हैं कि यह अज्ञात है। क्या X = Y सच है, गलत, या अज्ञात है, बशर्ते दोनों अज्ञात हैं? एसक्यूएल का कहना है कि परिणाम अज्ञात है । और यह किसी भी बाइनरी रिलेशनल ऑपरेशन के लिए कहता है, जो केवल तार्किक है (यहां तक ​​कि मॉडल में नाल होने से पहले स्थान पर नहीं है)।

एसक्यूएल दो अनारी पोस्टफिक्स ऑपरेटरों को भी प्रदान करता है, IS NULL और ये IS NOT NULL , ये उनके प्रचाण्ड के अनुसार सही या गलत हैं।

  • NULL IS NULL -> TRUE
  • NULL IS NOT NULL -> FALSE

क्योंकि यह व्यवहार स्थापित टर्नेरी लॉजिक के अनुसार होता है जहां NULL को अज्ञात मान माना जाता है।

यदि आप अज्ञात के रूप में अज्ञात के बारे में सोचते हैं, तो यह अधिक सहज हो जाता है:

क्या unknown a unknown b बराबर है? पता करने का कोई तरीका नहीं है, इसलिए: unknown

null जुड़े सभी तुलना अनिर्धारित हैं, और झूठे के लिए मूल्यांकन करते हैं। यह विचार, जो कि null का मूल्यांकन null बराबर के रूप में किया जा रहा है, null बराबर के बराबर के रूप में मूल्यांकन नहीं किया जा रहा है।

संक्षेप में उत्तर है … NULLs अजीब हैं , वे वास्तव में ऐसा व्यवहार नहीं करते जैसे आप उम्मीद करते हैं

SQL पर कैसे नल काम करता है यह एक शानदार पेपर है मुझे लगता है कि यह विषय की आपकी समझ को बेहतर बनाने में मदद करेगा। मुझे लगता है कि अभिव्यक्ति में शून्य मूल्यों को संभालने वाले वर्ग विशेष रूप से आपके लिए उपयोगी होंगे I

http://www.oracle.com/technology/oramag/oracle/05-jul/o45sql.html

किसी अभिव्यक्ति के भीतर नल का डिफ़ॉल्ट (एएनएसआई) व्यवहार नल होगा (उस के मामलों के साथ पर्याप्त अन्य जवाब हैं)।

हालांकि कुछ बढ़त के मामलों और चेतावनियां जो कि एमएस एसक्यूएल सर्वर से सूचीबद्ध हैं, जो सूचीबद्ध नहीं हैं I

  • एक बयान के भीतर शून्य जो एक साथ मूल्यों को समूहबद्ध कर रहे हैं, उन्हें समान माना जाएगा और एक साथ समूहीकृत किया जाएगा।
  • एक आदेश के भीतर शून्य मान जो उन्हें आदेश दे रहे हैं उन्हें समान माना जाएगा।
  • क्वेरी के विशिष्ट पहलू का मूल्यांकन करते समय अलग-अलग उपयोग करने वाले एक बयान के भीतर चयनित शून्य मानों को समान माना जाएगा

एसटीएमएल सर्वर में एसटीएनएसआईएनएलएलएस बंद का उपयोग करते हुए विशिष्ट नल = नल टेस्ट के संबंध में अभिव्यक्ति तर्क को ओवरराइड करना संभव है, जो तब आपको शून्य मानों के बीच समानता देगा – यह एक अनुशंसित कदम नहीं है, लेकिन मौजूद है।

 SET ANSI_NULLS OFF select result = case when null=null then 'eq' else 'ne' end SET ANSI_NULLS ON select result = case when null=null then 'eq' else 'ne' end 

यहाँ एक त्वरित फिक्स है

IsNull (ए, 0) = IsNull (बी, 0)

0 को आपके डेटा में कभी नहीं बदला जा सकता है

"क्या अज्ञात अज्ञात के बराबर है? पता करने का कोई तरीका नहीं है, इसलिए: अज्ञात।"

सवाल यह था कि तुलना की तुलना झूठी क्यों होती है?

तीन मूल्यवान तर्क दिए गए, यह वास्तव में UNKNOWN (गलत नहीं) की तुलना के लिए समझदार होगा। लेकिन एसक्यूएल गलत उत्पन्न करता है, और अज्ञात नहीं है

एसक्यूएल भाषा में असंख्य विकृतियों में से एक।

इसके अलावा, निम्नलिखित को ध्यान में रखा जाना चाहिए:

यदि "अज्ञात" टर्नरी तर्क में एक तार्किक मूल्य है, तो ऐसा होना चाहिए कि दो तर्कसंगत मूल्यों के बीच एक समानता की तुलना होनी चाहिए, जो दोनों "अज्ञात" (मूल्य) के लिए हैं, तो उस तुलना को सही होना चाहिए।

अगर तार्किक मूल्य स्वयं अज्ञात है, तो जाहिर है कि उस मूल्य को "अज्ञात" कहकर प्रस्तुत नहीं किया जा सकता है, क्योंकि इसका अर्थ यह होगा कि तार्किक मूल्य ज्ञात ("अज्ञात" होना)। यह, ओ, कैसे रिलायंसल सिद्धांत साबित होता है कि 3 मूल्यवान तर्क को कार्यान्वित करने से 4 मूल्यवान तर्क के लिए आवश्यकता होती है, कि एक 4 मूल्यवान तर्क एक 5 मूल्यवान तर्क के लिए आदि की ओर जाता है आदि आदि विज्ञापन अनंत।