दिलचस्प पोस्ट
कैसे एक UIView के शीर्ष की ओर बस एक सीमा जोड़ने के लिए pthread_create का उपयोग करते समय valgrind स्मृति रिसाव त्रुटियाँ Homebrew के लिए PATH को कैसे संशोधित करें? PHP – सबसे हल्के psr-0 अनुरूप autoloader घोषित स्ट्रिंग और आवंटित स्ट्रिंग के बीच का अंतर एक प्रगति पट्टी के साथ एक फ़ाइल को एक HTTP फार्म के माध्यम से, MultipartEntityBuilder के माध्यम से अपलोड करें वेबसाइट पर कई बार मतदान करने वाले उपयोगकर्ताओं को रोकना जावा सर्वलेट से JSP तक डेटा पास करें? स्थानीय भंडार के लिए अच्छा आईवी ट्यूटोरियल? प्रतिबिंब के माध्यम से निजी अंतिम क्षेत्रों को बदलना एक ईमेल भेजने के लिए ACTION_SENDTO होम को दबाए जाने के बाद आवेदन को पुन: लॉन्च करते समय नवीनतम लॉन्च गतिविधि पर वापस कैसे जाना है? रेल मीडिया फ़ाइल स्ट्रीम send_data या send_file विधि के माध्यम से बाइट रेंज अनुरोध स्वीकार करते हैं यूनिक्स कमांड लाइन में एक फ़ाइल से यादृच्छिक पंक्ति को पढ़ने का एक आसान तरीका क्या है? UITableViewCell का UITextField उपविजेता, सेल का सूचकांक प्राप्त करें

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

मैं इस लेख को पढ़ रहा था: 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)) 

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

Solutions Collecting From Web of "क्यों नल रिक्त झूठी के बराबर नहीं है"

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

संपादित करें

यहां, <> मनमानी द्विआधारी ऑपरेटर के लिए खड़ा है, 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 मूल्यवान तर्क के लिए आदि की ओर जाता है आदि आदि विज्ञापन अनंत।