SQL सर्वर में NULL = NULL का गलत मूल्यांकन क्यों किया जाता है


146

SQL सर्वर में यदि आपके पास nullParam=NULLएक क्लॉज है, तो यह हमेशा गलत का मूल्यांकन करता है। यह उल्टा है और इससे मुझे कई त्रुटियां हुई हैं। मुझे समझ में आया IS NULLऔर IS NOT NULLकीवर्ड इसे करने का सही तरीका है। लेकिन SQL सर्वर इस तरह से व्यवहार क्यों करता है?


166
मेरी एक बहन नहीं है, और न ही मेरा दोस्त है। यदि "NULL = NULL" है तो हमारे पास एक सामान्य बहन है, और इसलिए संबंधित हैं! :)
मैट हैमिल्टन

11
SQL NULLs (उदाहरण के लिए देखें: en.wikipedia.org/wiki/Null_%28SQL%29#Cont विवाद और Firstsql.com/inulls.htm ) पर लंबे समय से विवाद चल रहा है । यहाँ विशिष्ट बिंदु यह है कि समानता एक लंबे समय से स्थापित गणितीय अवधारणा है और SQL इसका उल्लंघन करता है - समानता प्रतिवर्त है: प्रत्येक x, x = x के लिए। यह हमेशा सच होना चाहिए, अन्यथा कोई समानता की व्याख्या पेश कर रहा है जो मानक नहीं है और भ्रम स्पष्ट परिणाम है।
MaD70

14
यह गणित का बिल्कुल भी उल्लंघन नहीं करता है। मैं दो नंबरों के बारे में सोच रहा हूं। मैं आपको बताने नहीं जा रहा हूं कि वे क्या हैं। तो अब आप ही बताइए, क्या वे समान हैं?
टॉम एच

10
@ मैट, मैं आपकी उपमा से सहमत नहीं हूँ। NULL = NULL का मतलब यह नहीं होगा कि आपकी एक सामान्य बहन है, इसका मतलब होगा कि आप दोनों में एक बहन की कमी है।
21

5
@ manu08 नहीं, वर्तमान कार्यान्वयन (जो NULL कभी NULL के बराबर नहीं है) का अर्थ है कि हम दोनों में एक बहन की कमी है, जो मेरी बात थी।
मैट हैमिल्टन

जवाबों:


205

शून्य को उस मामले में "अज्ञात" के रूप में सोचें (या "मौजूद नहीं है")। उन दोनों मामलों में, आप यह नहीं कह सकते कि वे समान हैं, क्योंकि आप दोनों में से किसी का मूल्य नहीं जानते हैं। तो, null = null सही (गलत या अशक्त, आपके सिस्टम पर निर्भर करता है) का मूल्यांकन करता है, क्योंकि आप यह कहने के लिए मूल्यों को नहीं जानते हैं कि वे समान हैं। यह व्यवहार ANSI SQL-92 मानक में परिभाषित किया गया है।

संपादित करें: यह आपके asi_nulls सेटिंग पर निर्भर करता है । यदि आपके पास ANSI_NULLS बंद है, तो यह सत्य का मूल्यांकन करेगा। एक उदाहरण के लिए निम्नलिखित कोड चलाएँ ...

set ansi_nulls off

if null = null
    print 'true'
else
    print 'false'


set ansi_nulls ON

if null = null
    print 'true'
else
    print 'false'

11
x = x केवल तभी सही होता है जब x एक ज्ञात मान होता है। NULL एक अज्ञात मान का एक पाठीय प्रतिनिधित्व है । यदि आपके पास दो अज्ञात मूल्य हैं, तो आप उनकी समानता के बारे में कुछ भी नहीं बता सकते। मेरा मानना ​​है कि कुछ शताब्दियों के लिए भी यह सच है।
ड्वेन क्रिस्टेंसेन

4
चूंकि यह दिसंबर है, चलो एक मौसमी उदाहरण का उपयोग करें। मेरे पास पेड़ के नीचे दो पर्चे हैं। अब, आप मुझे बताएं कि मुझे एक ही चीज़ के दो या नहीं मिले।
ड्वेन क्रिस्टेन्सन

5
SQL NULL IEEE फ़्लोटिंग पॉइंट NaN से अलग नहीं है, जहाँ आपके पास भी है (NaN == NaN) == false && (NaN != Nan) == false && (NaN < NaN) == false && ...- क्योंकि, ठीक है, अगर यह एक संख्या नहीं है, तो आप इसके बारे में बहुत कुछ नहीं कह सकते हैं; यह कुछ अज्ञात है। अवधारणा ध्वनि है, भले ही उन लोगों के लिए अयोग्य हो, जिन्होंने इसे पहले कभी नहीं देखा है।
पावेल मिनाव डे

8
यहाँ रिफ्लेक्सिटी का कोई उल्लंघन नहीं है, क्योंकि NULL मूल्यों के सेट का सदस्य नहीं है (डोमेन, संबंधपरक शब्दों में)। NULL एक मान नहीं है । यह मूल्य के लिए एक प्लेसहोल्डर है जो अज्ञात है।
पावेल मिनाव डे

9
इसे दूसरे शब्दों में कहें, तो प्रत्येक NULLSQL अभिव्यक्ति में एक अलग गणितीय चर के रूप में माना जा सकता है । तो एक अभिव्यक्ति के NULL = NULLरूप में व्यवहार किया जाना चाहिए x = y, जहां xऔर yअनबाउंड चर हैं। अब अगर कोई आपसे पूछे, तो इसका क्या मूल्य है x = y? एकमात्र उचित उत्तर है, "कुछ z"। तो हमारे पास (x = y) = z- या, इसे SQL में वापस भेजना (NULL = NULL) = NULL,।
पावेल मिनाव डे

130

फ्रैंक कितने साल का है? मुझे नहीं पता (अशक्त)।

शर्ली कितनी पुरानी है? मुझे नहीं पता (अशक्त)।

क्या फ्रैंक और शर्ली एक ही उम्र के हैं?

सही उत्तर होना चाहिए "मुझे नहीं पता" (शून्य), "नहीं" नहीं, क्योंकि फ्रैंक और शर्ली एक ही उम्र के हो सकते हैं, हम बस नहीं जानते।


4
मैं असहमत हूं कि अशक्त "अज्ञात" का प्रतीक है। इसका वास्तव में मतलब है "कोई डेटा नहीं"। इसका उपयोग उस मामले का प्रतिनिधित्व करने के लिए किया जा सकता है जहां जानकारी ज्ञात नहीं है, लेकिन यह वास्तव में यह इंगित करने के लिए उपयोग किए जाने की अधिक संभावना है कि कुछ मौजूद नहीं है। अपने उदाहरण को जारी रखने के लिए: फ्रैंक का मध्य नाम क्या है? उसके पास एक (शून्य) नहीं है। शर्ली का मध्य नाम क्या है? वह एक (अशक्त) नहीं है। क्या फ्रैंक और शर्ली का मध्य नाम समान है? हाँ? नहीं? पता नहीं? मैं "नहीं" के लिए एक तर्क देख सकता हूं, और मैं "नहीं जानता" के लिए एक तर्क देख सकता हूं, लेकिन "हां" के लिए कोई वास्तविक तर्क नहीं है जब तक कि आप अत्यधिक शाब्दिक न हों।
रिचीबन

2
@richiban मैं असहमत हूं। एक पंक्ति के अस्तित्व की कमी का मतलब है 'नो डेटा'
नील मैकग्यूगन

1
@NeilMcGuigan यह सच है कि यदि डेटा की अपनी तालिका है, लेकिन उस डेटा के बारे में क्या है जो एक कॉलम में दर्शाया गया है? क्या आप इस तथ्य का प्रतिनिधित्व करने के लिए 'अशक्त' का उपयोग नहीं करेंगे कि डेटा मौजूद नहीं है? 'ज्ञात नहीं ’डेटा अनुपस्थित होने का एक बहुत विशिष्ट कारण है।
रिचीबन

3
लेकिन null = nullपैदावार FALSE, नहीं NULL
slartidan

1
@slartidan मैं आपसे सहमत हूँ, हालाँकि यह गलत है
नील मैकगिन

28

यहाँ मैं अपनी स्थिति स्पष्ट रूप से स्पष्ट करूँगा।

वह NULL = NULLमूल्यांकन FALSEगलत है। हैकर और मिस्टर ने सही उत्तर दिया NULL। यहाँ क्यों है। ड्वेन क्रिस्टेन्सन ने स्कॉट इवे को एक टिप्पणी में मुझे लिखा :

चूंकि यह दिसंबर है, चलो एक मौसमी उदाहरण का उपयोग करें। मेरे पास पेड़ के नीचे दो पर्चे हैं। अब, आप मुझे बताएं कि मुझे एक ही चीज़ के दो या नहीं मिले।

वे अलग हो सकते हैं या वे समान हो सकते हैं, आप तब तक नहीं जानते जब तक कि दोनों प्रस्तुत नहीं करते। कौन जानता है? दुर्लभ है, लेकिन असंभव नहीं - आप दो लोगों को है कि एक दूसरे को जानते नहीं है और दोनों आप के लिए एक ही उपहार किया है आमंत्रित §

तो सवाल: क्या ये दोनों UNKNOWN समान (बराबर, =) प्रस्तुत करते हैं? सही उत्तर है: UNKNOWN (यानी NULL)।

इस उदाहरण को प्रदर्शित करने का इरादा था कि ".. ( falseया null, आपके सिस्टम पर निर्भर करता है) .." एक सही उत्तर है - यह नहीं है, केवल NULL 3VL में सही है (या आपके लिए एक सिस्टम स्वीकार करना ठीक है जो गलत उत्तर देता है? )

इस सवाल का एक सही जवाब इस दो बिंदुओं पर जोर देना चाहिए:

  • तीन-मूल्यवान तर्क (3VL) प्रतिसंतुलित है (देखें कि इस विषय पर अनगिनत अन्य प्रश्न स्टैकओवरफ़्लो और अन्य फोरम में सुनिश्चित करने के लिए);
  • SQL- आधारित DBMSes अक्सर 3VL का भी सम्मान नहीं करते हैं, वे कभी-कभी गलत उत्तर देते हैं (जैसे, मूल पोस्टर मुखर, SQL सर्वर इस मामले में करते हैं)।

इसलिए मैं दोहराता हूं: एसक्यूएल समानता के प्रतिवर्तित संपत्ति की व्याख्या करने के लिए किसी को मजबूर नहीं करता है, जो यह बताता है:

for any x, x = x §§ (सादा अंग्रेजी में: जो कुछ भी प्रवचन के ब्रह्मांड, एक "बात" हमेशा खुद के बराबर है )।

.. एक 3VL में ( TRUE, FALSE, NULL)। लोगों की उम्मीद 2VL ( TRUE, FALSEजो कि SQL में भी अन्य सभी मूल्यों के लिए मान्य है) के अनुरूप होगी , अर्थात x = x हमेशा TRUE x के किसी भी संभावित मूल्य के लिए मूल्यांकन करें - कोई अपवाद नहीं।

यह भी ध्यान दें कि NULLs " गैर-मूल्य " मान्य हैं (जैसा कि उनके अपोलॉजिस्ट उन्हें होने का दिखावा करते हैं) जो कि रिलेशन चर के हिस्से के रूप में विशेषता मान (??) के रूप में असाइन कर सकते हैं। इसलिए वे हर प्रकार (डोमेन) के स्वीकार्य मूल्य हैं, न केवल तार्किक अभिव्यक्तियों के प्रकार के।

और यह मेरी बात थी : NULLमूल्य के रूप में, एक "अजीब जानवर" है। व्यंजना के बिना, मैं कहना पसंद करता हूं: बकवास

मुझे लगता है कि यह सूत्रीकरण अधिक स्पष्ट और कम बहस योग्य है - मेरी खराब अंग्रेजी दक्षता के लिए खेद है।

यह केवल है एक NULLs की समस्याओं में से। जब संभव हो, पूरी तरह से उनसे बचने के लिए बेहतर है।

§ हम यहां मूल्यों के बारे में चिंतित हैं, इसलिए यह तथ्य कि दो प्रस्तुतियां हमेशा दो अलग-अलग भौतिक वस्तुएं हैं, एक वैध आपत्ति नहीं हैं; यदि आप आश्वस्त नहीं हैं कि मैं माफी चाहता हूँ, तो यह मूल्य और "ऑब्जेक्ट" शब्दार्थ के बीच के अंतर को समझाने का स्थान नहीं है (संबंधपरक बीजगणित में शुरू से ही मूल्य शब्दार्थ है - कोड के सूचना सिद्धांत को देखें; मुझे लगता है कि कुछ SQL DBST कार्यान्वयनकर्ता डॉन हैं; 'एक सामान्य शब्दार्थ के बारे में भी परवाह नहीं है)।

§§ मेरी जानकारी के लिए, इस एक स्वयंसिद्ध को स्वीकार कर लिया है (एक या किसी अन्य रूप में, लेकिन हमेशा एक 2VL में व्याख्या) प्राचीन काल से और कहा कि वास्तव में इतना सहज है, क्योंकि। 3VLs (वास्तव में लॉजिक्स का एक परिवार है) एक बहुत अधिक हालिया विकास है (लेकिन मुझे यकीन नहीं है कि जब पहली बार विकसित किया गया था)।

साइड नोट: यदि कोई SQL NULLs को सही ठहराने के प्रयासों के रूप में बॉटम , यूनिट और ऑप्शन टाइप्स को पेश करेगा , तो मैं काफी विस्तृत परीक्षा के बाद ही आश्वस्त हो जाऊंगा कि कैसे NULLs के साथ SQL कार्यान्वयन में ध्वनि प्रकार की व्यवस्था होगी और अंत में स्पष्ट करेंगे। क्या NULLs (ये "मूल्य-नहीं-काफी-मूल्य") वास्तव में हैं।


किस अनुसरण में मैं कुछ लेखकों को उद्धृत करूंगा। कोई त्रुटि या चूक शायद मेरी है और मूल लेखकों की नहीं।

SQL NULLs पर जो सेल्को

मैं देखता हूं कि जो सेल्को अक्सर इस मंच पर उद्धृत किया जाता है। जाहिर तौर पर वह यहां बहुत सम्मानित लेखक हैं। इसलिए, मैंने अपने आप से कहा: "उसने SQL NULLs के बारे में क्या लिखा है? वह NULLs को कई समस्याओं के बारे में कैसे समझाता है?"। मेरे एक मित्र के पास स्मार्टियों के लिए जो सेल्को एसक्यूएल का ईबुक संस्करण है : उन्नत एसक्यूएल प्रोग्रामिंग, तीसरा संस्करण । चलो देखते हैं।

सबसे पहले, सामग्री की तालिका। जो चीज मुझे सबसे ज्यादा चौंकाती है, वह है NULL का उल्लेख और सबसे विविध संदर्भों में कई बार:

3.4 अंकगणित और NULLs 109
3.5 परिवर्तित मानों से और NULL 110
3.5.1 NULLIF () फ़ंक्शन 110
6 NULLs: SQL 185 में तुलनात्मक डेटा अनुपलब्ध है।
NULLs 190
6.5 NULLs और तर्क
190.1 उपकुंजी उपकुंजी में NULLS 191
6.5.2 मानक एसक्यूएल सॉल्यूशंस 193
6.6 मैथ एंड नेल्स 193
6.7 फंक्शन्स और नेल्स 193
6.8 नेल्स और होस्ट लैंग्वेजेज 194
6.9 नेल्स के लिए डिजाइन 1956
6.9.1 मेज़बान प्रोग्राम्स 197
6.10 से NULLs से बचना मल्टीपल फुल वैल्यूज़ 198
10.1 ए नोट पर NULL प्रेडेट 241
10.1 होस्ट करें । NULLs 242 के 1 स्रोत
...

और इसी तरह। यह मेरे लिए "गंदा विशेष मामला" है।

मैं इस पुस्तक के कुछ अंशों के साथ इस पुस्तक के अंशों में जाऊँगा, जो अपने आप को कॉपीराइट कारणों से, आवश्यक तक सीमित रखने की कोशिश कर रहे हैं। मुझे लगता है कि ये उद्धरण "उचित उपयोग" सिद्धांत के भीतर आते हैं और वे पुस्तक खरीदने के लिए उत्तेजित भी कर सकते हैं - इसलिए मुझे उम्मीद है कि कोई भी शिकायत नहीं करेगा (अन्यथा मुझे सबसे अधिक इसे हटाने की आवश्यकता होगी, यदि सभी नहीं)। इसके अलावा, मैं उसी कारण से कोड स्निपेट की रिपोर्टिंग से बचना चाहूंगा। उसके लिए माफ़ करना। डेटॉल किए गए तर्क के बारे में पढ़ने के लिए किताब खरीदें।

कोष्ठक के बीच पृष्ठ संख्याएँ क्या अनुसरण करती हैं।

पूर्ण बाधा नहीं (11)

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

यह एक मूल्य नहीं है ; यह एक ऐसा मार्कर है जो एक ऐसी जगह रखता है जहां एक मान जा सकता है।

फिर इस "मूल्य लेकिन काफी मूल्य नहीं" बकवास। बाकी मुझे काफी समझदार लगता है।

(12)

संक्षेप में, NULLs SQL में कई अनियमित सुविधाओं का कारण बनता है, जिसकी चर्चा हम बाद में करेंगे। जब आप उनसे बच नहीं सकते तो आपकी सबसे अच्छी शर्त केवल स्थितियों और NULLs के नियमों को याद रखना है।

SQL, NULLs और अनंत के Apropos:

(१०४) अध्याय ३: SQL में NUMERIC DATA

एसक्यूएल ने कई कारणों से गणित के लिए IEEE मॉडल को स्वीकार नहीं किया है।

...

यदि SQL में गणित के लिए IEEE नियमों की अनुमति थी, तो हमें रूपांतरण के बाद टाइप रूपांतरण नियमों की आवश्यकता होगी और रूपांतरण के बाद एक अनंत सटीक संख्यात्मक मान का प्रतिनिधित्व करने का एक तरीका होगा। लोगों को NULLs से काफी परेशानी है, तो चलो वहाँ नहीं जाते हैं।

SQL क्रियान्वयन इस बात पर अनिर्णीत है कि NULL वास्तव में विशेष संदर्भों में क्या मायने रखता है:

3.6.2 घातीय कार्य (116)

समस्या यह है कि लघुगणक अपरिभाषित होते हैं जब (x <= 0)। कुछ SQL कार्यान्वयन एक त्रुटि संदेश लौटाते हैं, कुछ NULL और DB2 / 400 लौटाते हैं ; इसके परिणाम के रूप में संस्करण 3 रिलीज़ 1 लौटा * NEGINF ("नकारात्मक अनंत" के लिए छोटा)।

डेविड सेगवरन और CJ दिनांक के हवाले से जो सेल्को:

6 NULLs: SQL में लापता डेटा (185)

अपनी पुस्तक ए गाइड टू साइबेस एंड एसक्यूएल सर्वर , डेविड मैकगवरन और सीजे डेट ने कहा: "यह इस लेखक की राय है कि NULLs की तुलना में कम से कम वर्तमान में एसक्यूएल में परिभाषित और कार्यान्वित किया जाता है, इससे कहीं अधिक परेशानी होती है कि वे लायक हैं और इससे बचा जाना चाहिए; वे बहुत अजीब और असंगत व्यवहार प्रदर्शित करते हैं और त्रुटि और भ्रम का एक समृद्ध स्रोत हो सकते हैं। (कृपया ध्यान दें कि ये टिप्पणियां और आलोचनाएँ किसी भी प्रणाली पर लागू होती हैं जो SQL- शैली NULLs का समर्थन करती हैं, विशेष रूप से SQL सर्वर के लिए नहीं।)

नशा एक नशा के रूप में :

(186/187)

इस पुस्तक के बाकी हिस्सों में, मैं आपसे उनका उपयोग न करने का आग्रह करूंगा , जो विरोधाभासी लग सकता है, लेकिन ऐसा नहीं है। एक नाल के रूप में एक दवा के बारे में सोचो; इसे ठीक से उपयोग करें और यह आपके लिए काम करता है, लेकिन इसका दुरुपयोग करें और यह सब कुछ बर्बाद कर सकता है। आपकी सबसे अच्छी नीति यह है कि जब आप कर सकते हैं तो NULL से बचें और जब आप उन्हें ठीक से उपयोग करें।

यहां मेरी अनूठी आपत्ति "उन्हें ठीक से उपयोग करना" है, जो विशिष्ट कार्यान्वयन व्यवहारों के साथ बुरी तरह से बातचीत करता है।

५.५.१ उप-क्षेत्र में उपनिवेश (१ ९ १ / १ ९ २)

लोग भूल जाते हैं कि एक उपश्रेणी अक्सर NULL के साथ तुलना छिपाती है। इन दो तालिकाओं पर विचार करें:

...

रिजल्ट खाली होगा। यह प्रतिवाद है , लेकिन सही है।

(विभाजक)

6.5.2 मानक SQL समाधान (193)

SQL-92 ने 3VL (थ्री-वैल्यूड लॉजिक) की कुछ समस्याओं को फॉर्म के एक नए विधेय को जोड़कर हल किया:

<खोज स्थिति> IS [NOT] TRUE | FALSE | अनजान

लेकिन UNKNOWN अपने आप में समस्याओं का एक स्रोत है, इसलिए कि CJ दिनांक, नीचे दी गई अपनी पुस्तक में अध्याय 4.5 में दी गई है। SQL में नल से बचना :

  • किसी भी संदर्भ में कीवर्ड का उपयोग न करें।

UNKNOWN पर "ASIDE" पढ़ें , नीचे भी लिंक किया गया है।

6.8 NULLs और होस्ट भाषा (194)

हालाँकि, आपको पता होना चाहिए कि जब उन्हें होस्ट प्रोग्राम में पास करना होता है तो NULL को कैसे हैंडल किया जाता है। कोई मानक होस्ट भाषा जिसके लिए एक एम्बेडिंग परिभाषित है, NULLs का समर्थन करती है, जो आपके डेटाबेस स्कीमा में उनके उपयोग से बचने का एक और अच्छा कारण है।

(विभाजक)

6.9 NULLs के लिए डिज़ाइन सलाह (195)

जब भी संभव हो, सभी स्तंभों पर NOT NULL बाधाओं के साथ अपने सभी बेस टेबल को घोषित करना एक अच्छा विचार है। NULLs उन लोगों को भ्रमित करते हैं जो SQL नहीं जानते हैं, और NULLs महंगे हैं।

आपत्ति: NULLs ऐसे लोगों को भी भ्रमित करता है जो SQL को अच्छी तरह से जानते हैं, नीचे देखें।

(195)

NULLs को FOREIGN KEY में टाला जाना चाहिए। एसक्यूएल इसे "संदेह का लाभ" रिश्ते की अनुमति देता है, लेकिन इससे उन प्रश्नों में जानकारी का नुकसान हो सकता है जो इसमें शामिल होते हैं। उदाहरण के लिए, इन्वेंट्री में एक भाग संख्या कोड दिया गया है जिसे एक आदेश तालिका द्वारा एक अग्रणी कुंजी के रूप में संदर्भित किया गया है, आपको उन भागों की सूची प्राप्त करने में समस्या होगी जिनके पास NULL है। यह एक अनिवार्य रिश्ता है; आप उस हिस्से को ऑर्डर नहीं कर सकते जो मौजूद नहीं है।

(विभाजक)

6.9.1 मेजबान कार्यक्रमों (197) से NULLs से बचना

आप कुछ प्रोग्रामिंग अनुशासन के साथ NULL को होस्ट प्रोग्राम से डेटाबेस में डालने से बच सकते हैं।

...

  1. प्रोग्रामिंग और रिपोर्टिंग पर लापता डेटा के प्रभाव को निर्धारित करें: NULLs के साथ संख्यात्मक कॉलम एक समस्या है, क्योंकि कुल कार्यों का उपयोग करने वाले प्रश्न भ्रामक परिणाम प्रदान कर सकते हैं।

(विभाजक)

(227)

खाली सेट का SUM () हमेशा NULL होता है। इस ट्रिक का उपयोग करते समय किए गए सबसे आम प्रोग्रामिंग त्रुटियों में से एक क्वेरी लिखना है जो एक से अधिक पंक्ति में लौट सके। यदि आपने इसके बारे में नहीं सोचा, तो आपने अंतिम उदाहरण के रूप में लिखा होगा: ...

(विभाजक)

10.1.1 NULLs के स्रोत (242)

यह याद रखना महत्वपूर्ण है कि NULLs कहां हो सकता है। वे एक स्तंभ में सिर्फ एक संभावित मूल्य से अधिक हैं । खाली सेटों पर एकत्र कार्य, OUTER JOINs, NULLs के साथ अंकगणितीय अभिव्यक्तियाँ, और OLAP ऑपरेटर सभी पूर्ण रिटर्न लौटाते हैं। ये निर्माण अक्सर VIEWs में कॉलम के रूप में दिखाई देते हैं।

(विभाजक)

(301)

NULLs के साथ एक और समस्या तब देखने को मिलती है जब आप IN विधेयकों को EXCSTS में बदलने की कोशिश करते हैं।

(विभाजक)

16.3 सभी विधेय और एक्स्ट्रेमा फंक्शंस (313)

यह पहली बार में स्पष्ट है कि ये दो विधेय SQL में समान नहीं हैं:

...

लेकिन आपको एक्स्ट्रेमा फ़ंक्शन के नियमों को याद रखना होगा - वे अधिक या कम मानों को वापस करने से पहले सभी NULL को छोड़ देते हैं। सभी विधेय NULLs को नहीं छोड़ते हैं, इसलिए आप उन्हें परिणामों में प्राप्त कर सकते हैं।

(विभाजक)

(315)

हालांकि, मानक में परिभाषा को नकारात्मक में लिखा गया है, ताकि NULL को संदेह का लाभ मिले। ...

जैसा कि आप देख सकते हैं, UNIQUE बाधाओं में NULL से बचने के लिए यह एक अच्छा विचार है।

चर्चा ग्रुप द्वारा:

NULLs के साथ ऐसा व्यवहार किया जाता है जैसे कि वे सभी एक दूसरे के बराबर थे , और अपना समूह बनाते हैं। प्रत्येक समूह को फिर एक नई परिणाम तालिका में एकल पंक्ति में घटा दिया जाता है जो पुराने को बदल देता है।

इसका मतलब यह है कि ग्रुप बाय क्लॉज के लिए NULL = NULL 3VL की तरह NULL का मूल्यांकन नहीं करता है, लेकिन यह TRUE का मूल्यांकन करता है।

SQL मानक भ्रामक है:

ORDER BY और NULLs (329)

क्या NULL मान को सॉर्ट कुंजी मान को गैर-NULL मान से अधिक या कम माना जाता है, लेकिन कार्यान्वयन-परिभाषित है, लेकिन ...

... SQL उत्पाद हैं जो इसे किसी भी तरह से करते हैं।

मार्च 1999 में, क्रिस फर्रार ने अपने एक डेवलपर्स से एक सवाल उठाया, जिसके कारण उसने SQL मानक के एक हिस्से की जांच की, जो मुझे लगा कि मैं उसे समझता था । क्रिस ने सामान्य समझ और विनिर्देशन के वास्तविक शब्दों के बीच कुछ अंतर पाया ।

और इसी तरह। मुझे लगता है कि सेल्को द्वारा पर्याप्त है।

SQL NULLs पर CJ दिनांक

CJ दिनांक NULLs के बारे में अधिक कट्टरपंथी है: SQL, अवधि में NULLs से बचें। वास्तव में, उनकी एसक्यूएल और रिलेशनल थ्योरी के अध्याय 4 : सटीक एसक्यूएल कोड को कैसे लिखें "शीर्षक, कोई नल नहीं है", सबचैपर्स के साथ "4.4 क्या गलत है?" और "4.5 एसक्यूएल में नल से बचना" (लिंक का पालन करें: Google पुस्तकों के लिए धन्यवाद, आप कुछ पृष्ठों को ऑन-लाइन पढ़ सकते हैं)।

SQL NULLs पर फैबियन पास्कल

डेटाबेस प्रबंधन में इसके व्यावहारिक मुद्दों से - थिंकिंग प्रैक्टिशनर के लिए एक संदर्भ (कोई अंश ऑन-लाइन, क्षमा करें):

10.3 प्रथागत प्रभाव

10.3.1 SQL NULLs

... एसक्यूएल 3 वीएल में निहित समस्याओं के साथ-साथ कई क्विरक्स, जटिलताओं, प्रतिवाद और एकमुश्त त्रुटियों से ग्रस्त है [10, 11]; उनमें से निम्नलिखित हैं:

  • एकत्रित कार्य (जैसे, SUM (), AVG ()) NULLs (COUNT को छोड़कर) को अनदेखा करते हैं।
  • पंक्तियों के बिना एक तालिका पर एक अदिश अभिव्यक्ति 0 के बजाय गलत तरीके से NULL का मूल्यांकन करती है।
  • "NULL = NULL" अभिव्यक्ति NULL का मूल्यांकन करती है, लेकिन वास्तव में SQL में अमान्य है; अभी तक आदेश द्वारा NULLs को समान माना जाता है (जो भी वे "नियमित" मूल्यों का पालन करते हैं या DBMS विक्रेता के लिए छोड़ दिया जाता है)।
  • "X IS NOT NULL" की अभिव्यक्ति "NOT (x IS NULL)" के बराबर नहीं है, जैसा कि 2VL में है।

...

सभी व्यावसायिक रूप से कार्यान्वित SQL बोलियाँ इस 3VL दृष्टिकोण का पालन करती हैं, और, इस प्रकार, न केवल वे इन समस्याओं को हटाते हैं , बल्कि उनके पास spefic कार्यान्वयन समस्याएं भी होती हैं, जो उत्पादों में भिन्न होती हैं


4
"और यह मेरी बात थी: NULL, मान के रूप में, एक" अजीब जानवर "है।" - ऐसा इसलिए NULLहै क्योंकि मूल्य नहीं है।
पावेल मिनाएव

1
इसके अलावा, SQL सर्वर नहीं देता है (NULL = NULL) -> FALSE। के लिए प्रलेखन उद्धृत करने के लिए ANSI_NULLS: "जब निर्दिष्ट किया जाता है, तो सभी तुलना शून्य मान का मूल्यांकन करने के लिए UNKNOWN । जब बंद निर्दिष्ट किया जाता है, तो गैर-मूल्य मान की तुलना शून्य मान के मूल्यांकन से होती है यदि दोनों मान पूर्ण हो गए हैं।"
पावेल मिनावे।

@Pavel Minaev: a) और FALSE से बेहतर TRUE कैसे है? ख) यदि यह मान नहीं है तो चर मानों के हिस्से के रूप में क्यों सौंपा गया है?
MaD70

1
>> चूंकि यह दिसंबर है, चलो एक मौसमी उदाहरण का उपयोग करें। मेरे पास पेड़ के नीचे दो पर्चे हैं। अब, आप मुझे बताएं कि मुझे एक ही चीज़ के दो या नहीं मिले। ..... हाँ, आपने दो चीजों को प्राप्त करने के साथ-साथ आपके वर्तमान ज्ञान की सीमा तक, आपको अभी तक चिंतित किया है , वे आपके लिए बिल्कुल समान हैं
ब्रैड थॉमस

3
null = null सही होना चाहिए। नल अच्छी तरह से परिभाषित मूल्य है जो एक अज्ञात मूल्य का प्रतिनिधित्व कर सकता है , लेकिन यह एक मूल्य की अनुपस्थिति का भी प्रतिनिधित्व कर सकता है । यह डेवलपर को तय करना चाहिए कि अशक्त क्या प्रतिनिधित्व करता है, लेकिन अशक्तता पूरी तरह से एक मूल्य है और अशक्त शून्य = अशक्त है। किसी भी अन्य कार्यान्वयन आपदा के लिए बाध्य है, क्योंकि आप मूल रूप से बूलियन कहे जाने वाले विधेय तर्क में हस्तक्षेप कर रहे हैं। मुझे लगता है कि यह SQL सर्वर में स्थापित करने पर एक स्थायी होता जा रहा है। इसके साथ ही ऑफ कर दें।
ट्राइंको

9

शायद यह निर्भर करता है, लेकिन मैंने सोचा कि NULL=NULLनाल के NULLसाथ अधिकांश कार्यों को एक ऑपरेंड के रूप में पसंद करता है।


9

सिर्फ इसलिए कि आप नहीं जानते कि दो चीजें क्या हैं, इसका मतलब यह नहीं है कि वे समान हैं। अगर आपको लगता है कि NULLआप "NULL" (स्ट्रिंग) के बारे में सोचते हैं तो आप शायद Postgresl के IS DISTINCT FROMAND की तरह समानता की एक अलग परीक्षा चाहते हैंIS NOT DISTINCT FROM

"तुलना फ़ंक्शंस और ऑपरेटर्स" पर PostgreSQL डॉक्स से

अभिव्यक्ति IS DISTINCT FROMअभिव्यक्ति

अभिव्यक्ति IS NOT DISTINCT FROMअभिव्यक्ति

गैर-शून्य इनपुट के लिए, ऑपरेटर IS DISTINCT FROMके समान है <>। हालाँकि, यदि दोनों इनपुट शून्य हैं, तो यह गलत है, और यदि केवल एक इनपुट शून्य है, तो यह सही है। इसी तरह, गैर-शून्य इनपुट के लिए IS NOT DISTINCT FROMसमान है =, लेकिन यह तब सही होता है जब दोनों इनपुट शून्य होते हैं, और केवल एक इनपुट शून्य होने पर गलत होता है। इस प्रकार, ये निर्माण प्रभावी रूप से कार्य करते हैं, हालांकि अशक्त "अज्ञात" के बजाय एक सामान्य डेटा मान थे।


5

कम से कम कहने के लिए NULL की अवधारणा संदिग्ध है। कोडड ने संबंधपरक मॉडल और NULL की अवधारणा को संदर्भ में पेश किया (और एक से अधिक प्रकार के NULL का प्रस्ताव दिया!) हालांकि, संबंधपरक सिद्धांत कॉड के मूल लेखन के बाद से विकसित हुआ है: उनके कुछ प्रस्तावों को गिरा दिया गया है (जैसे प्राथमिक कुंजी)। और दूसरों को कभी नहीं पकड़ा (जैसे थीटा ऑपरेटरों)। आधुनिक संबंधपरक सिद्धांत (वास्तव में संबंधपरक सिद्धांत में, मुझे तनाव देना चाहिए) NULL का अस्तित्व ही नहीं है। तीसरा मैनिफेस्टो देखें। http://www.thethirdmanifesto.com/

SQL भाषा पश्चगामी संगतता की समस्या से ग्रस्त है। NULL को SQL में अपना रास्ता मिल गया और हम इसके साथ फंस गए हैं। संभवतः, NULLSQL का कार्यान्वयन त्रुटिपूर्ण है (SQL Server का कार्यान्वयन चीजों को इसके ANSI_NULLSविकल्प के कारण और भी जटिल बना देता है)।

मैं बेस टेबल में NULLable कॉलम के उपयोग से बचने की सलाह देता हूं।


हालाँकि शायद मुझे लुभाया नहीं जाना चाहिए, मैं सिर्फ NULLएसक्यूएल में काम करने के तरीके के बारे में खुद का सुधार करना चाहता था :

NULL= का NULLमूल्यांकन करता हैUNKNOWN

UNKNOWN एक तार्किक मूल्य है।

NULL डेटा मान है।

यह उदाहरण के लिए साबित करना आसान है

SELECT NULL = NULL

SQL सर्वर में एक त्रुटि उत्पन्न करता है। यदि परिणाम एक डेटा मूल्य था तो हम देखने की उम्मीद करेंगेNULL करेंगे, क्योंकि यहां कुछ उत्तर (गलत तरीके से) सुझाव देते हैं कि हम करेंगे।

तार्किक मूल्य UNKNOWN को क्रमशः SQL DML और SQL DDL में अलग तरह से व्यवहार किया जाता है।

SQL DML में, UNKNOWN पंक्तियों को परिणाम से हटा दिया जाता है।

उदाहरण के लिए:

CREATE TABLE MyTable
(
 key_col INTEGER NOT NULL UNIQUE, 
 data_col INTEGER
 CHECK (data_col = 55)
);

INSERT INTO MyTable (key_col, data_col)
   VALUES (1, NULL);

INSERTइस पंक्ति के लिए सफल होता है, भले ही CHECKहालत पर ले कर जाता NULL = NULL। यह SQL-92 ("ANSI") में परिभाषित किया गया है:

11.6 तालिका बाधा परिभाषा

3)

यदि तालिका बाधा एक चेक बाधा परिभाषा है, तो SC को तुरंत चेक बाधा परिभाषा में निहित खोज स्थिति होने दें और T को तालिका के संबंधित विवरण वर्णनकर्ता में शामिल तालिका का नाम दें; अगर और केवल अगर टेबल बाधा संतुष्ट नहीं है

प्रश्न (चयन करें * टी से नहीं है जहां (एससी))

सच हैं।

तर्क का पालन करते हुए उसे फिर से ध्यान से पढ़ें।

सादे अंग्रेजी में, हमारी नई पंक्ति को 'संदेह का लाभ' दिया जाता है UNKNOWN और इसे पारित करने की अनुमति दी जाती है।

SQL DML में, WHEREक्लॉज के लिए नियम का पालन करना बहुत आसान है:

खोज स्थिति को T की प्रत्येक पंक्ति पर लागू किया जाता है। जहां खंड T की उन पंक्तियों की तालिका है, जिसके लिए खोज स्थिति का परिणाम सत्य है।

सादे अंग्रेजी में, पंक्तियों का मूल्यांकन करने वाले पंक्तियों को परिणाम UNKNOWNसे हटा दिया जाता है।


5

पर TechNet वहाँ कैसे शून्य मान काम के लिए एक अच्छा व्याख्या है।

अशक्त का अर्थ है अज्ञात।

इसलिए बूलियन अभिव्यक्ति

मूल्य = बातिल

असत्य का मूल्यांकन नहीं करता है, यह अशक्त करने के लिए मूल्यांकन करता है, लेकिन यदि यह एक खंड का अंतिम परिणाम है, तो कुछ भी वापस नहीं किया जाता है। यह करने के लिए एक व्यावहारिक तरीका है, क्योंकि अशक्त लौटने से गर्भ धारण करना मुश्किल होगा।

यह दिलचस्प और बहुत महत्वपूर्ण हैनिम्नलिखित को समझना है:

यदि किसी प्रश्न में हमारे पास है

where (value=@param Or @param is null) And id=@anotherParam

तथा

  • मूल्य = 1
  • @ अपरम अशक्त है
  • आईडी = 123
  • @ AnotherParam = 123

फिर

"value = @ param" null का मूल्यांकन करता है
"@param null है" सत्य का मूल्यांकन करता है
"id = @ otherParam" मूल्यांकन करता है सत्य के लिए

तो मूल्यांकन किया जाने वाला अभिव्यक्ति बन जाता है

(अशक्त या सत्य) और सत्य

हमें यह सोचकर ललचाया जा सकता है कि यहाँ "अशक्त या सत्य" का मूल्यांकन अशक्त किया जाएगा और इस प्रकार पूरी अभिव्यक्ति शून्य हो जाएगी और पंक्ति वापस नहीं होगी।

ऐसा नहीं है। क्यों?

क्योंकि "अशक्त या सत्य" सत्य का मूल्यांकन करता है, जो कि बहुत तार्किक है, क्योंकि यदि एक संचालक ओर-संचालक के साथ सत्य है, तो कोई बात नहीं, अन्य संकार्य का मान, प्रचालन सत्य हो जाएगा। इस प्रकार यह कोई फर्क नहीं पड़ता कि अन्य ऑपरेंड अज्ञात (शून्य) है।

तो हम अंत में सच है = सच है और इस प्रकार पंक्ति वापस आ जाएगी।

नोट: एक ही क्रिस्टल स्पष्ट तर्क के साथ कि "अशक्त या सत्य" सही का मूल्यांकन करता है, "अशक्त और सत्य" शून्य का मूल्यांकन करता है।

अपडेट:
ठीक है, बस इसे पूरा करने के लिए मैं यहां बाकी को भी जोड़ना चाहता हूं जो उपरोक्त के संबंध में काफी मजेदार है।

"अशक्त या असत्य" शून्य का मूल्यांकन करता है, "अशक्त और असत्य" का मूल्यांकन असत्य से होता है। :)

तर्क पहले की तरह अब भी स्पष्ट है।


4

क्योंकि NULL'अज्ञात मान' और दो अज्ञात मूल्य समान नहीं हो सकते।

तो, अगर हमारे तर्क NULLN ° 1 NULLN ° 2 के बराबर है , तो हमें यह बताना होगा कि किसी तरह:

SELECT 1
WHERE ISNULL(nullParam1, -1) = ISNULL(nullParam2, -1)

जहाँ ज्ञात मान -1N ° 1 -1N ° 2 के बराबर है


nullParam1 = -1और nullParam2 =NULLविमान दुर्घटना .... .... होना चाहिएISNULL(NULLIF(@nullParam1, @nullParam2), NULLIF(@nullParam2, nullParam1)) IS NULL
सेल्विन

4

यहाँ उत्तर सभी को एक सीएस परिप्रेक्ष्य से आते हैं, इसलिए मैं एक डेवलपर परिप्रेक्ष्य से जोड़ना चाहता हूं।

एक डेवलपर के लिए NULL बहुत उपयोगी है। यहां उत्तर कहते हैं कि NULL का मतलब अज्ञात है, और शायद CS सिद्धांत में यह सच है, याद नहीं है, यह कुछ समय रहा है। वास्तविक विकास में, हालांकि, कम से कम मेरे अनुभव में, यह लगभग 1% होता है। अन्य 99% का उपयोग उन मामलों के लिए किया जाता है जहां मान UNKNOWN नहीं है, लेकिन यह ABS TO BEENT है।

उदाहरण के लिए:

  • Client.LastPurchaseएक नए ग्राहक के लिए। यह अज्ञात नहीं है, यह ज्ञात है कि उसने अभी तक खरीदारी नहीं की है।

  • एक के साथ एक ORM का उपयोग करते समय तालिका प्रति वर्ग पदानुक्रम मानचित्रण, कुछ मान सिर्फ कुछ वर्गों के लिए मैप नहीं कर रहे हैं।

  • एक पेड़ की संरचना की मैपिंग करते समय एक जड़ आमतौर पर होगीParent = NULL

  • और बहुत सारे...

मुझे यकीन है कि कुछ बिंदुओं पर अधिकांश डेवलपर्स ने लिखा WHERE value = NULL, कोई परिणाम नहीं मिला, और यही है कि उन्होंने कैसे सीखाIS NULL सिंटैक्स के । जरा देखें कि इस प्रश्न और जुड़े लोगों के पास कितने वोट हैं।

SQL डेटाबेस एक उपकरण है, और उन्हें उस तरह से डिज़ाइन किया जाना चाहिए जो उनके उपयोगकर्ताओं के लिए समझना आसान है।


1
हर कोई "NULL अज्ञात है" चिल्लाने लगता है और फिर व्यवहार को सही ठहराता है। हां, अगर वह एक आधार है तो 3VL शायद जवाब दे। लेकिन लगभग सभी DBs पर मैं काम करता हूं, NULL का मतलब अनुपस्थित है। क्षमा करें, आपकी आवाज़ जंगल में खो गई है @AlexDev
John Rees

3

NULL कुछ भी नहीं के बराबर है, खुद भी नहीं। NULL के व्यवहार को समझने के लिए मेरा व्यक्तिगत समाधान यह है कि जितना संभव हो उतना उपयोग करने से बचें :)।


1
सब कुछ समान हो सकता है, जैसा कि बाएं / दाएं / बाहरी जुड़ाव के मामले में है ...
मिगुएल वेंचुरा

5
क्या एक मूर्खतापूर्ण अनुत्पादक जवाब। वही प्राथमिक बच्चों को बीजगणित के बारे में कहा जा सकता है, लेकिन वास्तव में यह स्वीकार किए बिना कि क्या हल करने की कोशिश की जा रही है, वह मूर्खतापूर्ण है, जो उसने किया।
इवान कैरोल

2
@ इवान: वास्तव में, NULL से बचना एक ध्वनि समाधान है। 3-मूल्यवान तर्क कोई विवादास्पद नहीं है, और कई लोगों को लगता है कि एसक्यूएल NULL के बिना बेहतर होगा और सभी (आवश्यक) जटिलता में प्रवेश करता है।
सालेके

3
"बहुत से लोग" एक व्यंग्य शब्द है, और "अनियंत्रित नहीं" अधिक सरल "विवादास्पद" है, जिसमें 3VL नहीं है।
इवान कैरोल

"NULL कुछ भी नहीं के बराबर है, खुद भी नहीं।" उस तर्क के आधार पर, <somevalue>! = NULL को सही लौटना चाहिए। SQL के अजीब ब्रह्मांड में, हालांकि, यह गलत है।
टॉम लिंट

3

प्रश्न:
क्या एक अज्ञात एक दूसरे के बराबर अज्ञात है?
(NULL = NULL)
यह प्रश्न कुछ ऐसा है जिसका कोई भी उत्तर नहीं दे सकता है इसलिए यह आपके asi_nulls सेटिंग के आधार पर सही या गलत के लिए चूक करता है।

हालाँकि प्रश्न:
क्या यह अज्ञात चर अज्ञात है?
यह प्रश्न काफी अलग है और इसका उत्तर सच्चे रूप में दिया जा सकता है।

nullVariable = null मूल्यों की तुलना कर रहा है
nullVariable null है चर की स्थिति की तुलना है


3

भ्रम अप्रत्यक्षता (अमूर्तता) के स्तर से उत्पन्न होता है जो NULL के उपयोग से आता है

वापस "क्रिसमस ट्री के नीचे क्या है" सादृश्य, "अज्ञात" बॉक्स ए में है के बारे में ज्ञान की स्थिति का वर्णन करता है।

इसलिए यदि आपको नहीं पता कि बॉक्स ए में क्या है, तो आप कहते हैं कि यह "अज्ञात" है, लेकिन इसका मतलब यह नहीं है कि "अज्ञात" बॉक्स के अंदर है । अज्ञात के अलावा कुछ बॉक्स में है, संभवतः किसी प्रकार की वस्तु, या संभवतः कुछ भी बॉक्स में नहीं है।

इसी तरह, यदि आपको नहीं पता कि बॉक्स बी में क्या है, तो आप "अज्ञात" होने के रूप में सामग्री के बारे में अपने ज्ञान के राज्य को लेबल कर सकते हैं।

तो यहाँ किकर है: बॉक्स ए के बारे में आपकी जानकारी का ज्ञान बॉक्स बी के बारे में आपके ज्ञान के राज्य के बराबर है । (दोनों मामलों में आपके ज्ञान की स्थिति "अज्ञात" या "मुझे नहीं पता कि बॉक्स में क्या है"।) लेकिन बक्से की सामग्री समान हो सकती है या नहीं भी हो सकती है।

SQL में वापस जा रहे हैं, आदर्श रूप से आपको केवल मूल्यों की तुलना करने में सक्षम होना चाहिए जब आप जानते हैं कि वे क्या हैं। दुर्भाग्य से, ज्ञान की कमी का वर्णन करने वाला लेबल सेल में ही संग्रहीत होता है , इसलिए हम इसे मूल्य के रूप में उपयोग करने के लिए लुभाते हैं। लेकिन हमें इसका उपयोग मूल्य के रूप में नहीं करना चाहिए, क्योंकि इससे "बॉक्स ए की सामग्री बॉक्स बी की सामग्री के बराबर हो जाएगी जब हम नहीं जानते कि बॉक्स ए में क्या है और / या हमें नहीं पता कि बॉक्स बी में क्या है।" (तार्किक रूप से, निहितार्थ "अगर मुझे नहीं पता कि बॉक्स ए में क्या है और अगर मुझे नहीं पता कि बॉक्स बी में क्या है, तो बॉक्स ए में क्या है = बॉक्स बी में क्या है" गलत है।)

याय, डेड हॉर्स।


3

MSDN के पास nulls पर एक अच्छा वर्णनात्मक लेख और तीन राज्य तर्क हैं जो वे संलग्न करते हैं।

संक्षेप में, SQL92 युक्ति NULL को अज्ञात के रूप में परिभाषित करता है, और निम्नलिखित ऑपरेटरों में NULL का उपयोग uninitiya के लिए अप्रत्याशित परिणाम देता है:

= operator NULL   true   false 
NULL       NULL   NULL   NULL
true       NULL   true   false
false      NULL   false  true

and op     NULL   true   false 
NULL       NULL   NULL   false
true       NULL   true   false
false      false  false  false

or op      NULL   true   false 
NULL       NULL   true   NULL
true       true   true   true
false      NULL   true   false

लेकिन सवाल 3VL (तीन-मूल्यवान तर्क) के बारे में नहीं है, समानता की प्रतिवर्ती संपत्ति के बारे में है।
MaD70

अधिक सटीक होने के लिए, जैसा कि मैंने अंत में अपने उत्तर में विस्तृत किया है, जब 3VL में समानता की व्याख्या की जाती है तो समस्याएं उत्पन्न होती हैं ताकि समानता की प्रतिपल संपत्ति हमेशा सच का मूल्यांकन न करें।
MaD70

1

null sql में अज्ञात है, इसलिए हम दो अज्ञात समान होने की उम्मीद नहीं कर सकते।

हालाँकि आप उस व्यवहार को ANSI_NULLS को बंद (इसके डिफ़ॉल्ट रूप से) सेट करके प्राप्त कर सकते हैं। आप = n ऑपरेटर के ऑपरेटर का उपयोग कर सकेंगे

SET ANSI_NULLS off
if null=null
print 1
else 
print 2
set ansi_nulls on
if null=null
print 1
else 
print 2

2
यह सभी प्रकार की नहीं है । दुनिया की एक परिभाषा है null, इसे समझना या सिर्फ अंतर टाइप करने और कॉलम को अपडेट करने के लिए तालिका को बदलना।
इवान कैरोल

3
मैं वास्तव में सेट ANSI_NULLS बंद की सिफारिश नहीं की थी। मुझे पता चला ANSI_NULLS के बारे में कठिन तरीका है। लेकिन विशेष रूप से उपलब्ध सभी विकल्पों को जानना हमेशा अच्छा होता है जब आप एक पंक्ति भर में आते हैं जो कहता है कि SomeId = null आप ANSI_NULLS के बारे में जाने बिना उस पंक्ति का कैसे अर्थ बनाएंगे। जिस तरह से मैं इसे देखता हूं, मेरी पोस्ट उपयोगी थी .. :)
पीएस।

1

आप सरकार नागरिकों के बारे में जानकारी दर्ज करने के लिए काम करते हैं। इसमें देश के प्रत्येक व्यक्ति के लिए राष्ट्रीय आईडी शामिल है। एक बच्चे को लगभग 40 साल पहले एक चर्च के दरवाजे पर छोड़ दिया गया था, किसी को नहीं पता कि उनके माता-पिता कौन हैं। इस व्यक्ति को के पिता आईडी है NULL। ऐसे दो लोग मौजूद हैं। कम से कम एक अन्य व्यक्ति (जो भाई बहन हैं) के साथ समान पिता आईडी साझा करने वाले लोगों की गणना करें। क्या आप उन दोनों को भी गिनते हैं?

जवाब नहीं है, आप नहीं, क्योंकि हम नहीं जानते कि वे भाई बहन हैं या नहीं।

मान लें कि आपके पास कोई NULLविकल्प नहीं है , और इसके बजाय "अज्ञात", शायद एक खाली स्ट्रिंग या संख्या 0 या * चरित्र, आदि का प्रतिनिधित्व करने के लिए कुछ पूर्व निर्धारित मूल्य का उपयोग करें, तो आपके प्रश्नों में होगा कि * = * , 0 = 0, और "" = "", आदि यह वह नहीं है जो आप चाहते हैं (ऊपर दिए गए उदाहरण के अनुसार), और जैसा कि आप अक्सर इन मामलों के बारे में भूल सकते हैं (ऊपर का उदाहरण साधारण रोजमर्रा की सोच के बाहर एक स्पष्ट फ्रिंज मामला है) ), तो आप के लिए भाषा की जरूरत है कि आप को याद हैNULL = NULL सच नहीं है।

आव्श्यक्ता ही आविष्कार की जननी है।


0

अन्य अद्भुत उत्तरों के लिए बस एक अतिरिक्त:

AND: The result of true and unknown is unknown, false and unknown is false,
while unknown and unknown is unknown.

OR: The result of true or unknown is true, false or unknown is unknown, while unknown or unknown is unknown.

NOT: The result of not unknown is unknown

0

यदि आप एक अभिव्यक्ति की तलाश कर रहे हैं जो दो NULLs के लिए सही है जो आप उपयोग कर सकते हैं:

SELECT 1 
WHERE EXISTS (
    SELECT NULL
    INTERSECT
    SELECT NULL
)

यदि आप डेटा को एक तालिका से दूसरी तालिका में बदलना चाहते हैं तो यह उपयोगी है।


0

समानता परीक्षण, उदाहरण के लिए, एक मामले के बयान में जब खंड, से बदला जा सकता है

XYZ = NULL 

सेवा

XYZ IS NULL

अगर मैं रिक्त और खाली स्ट्रिंग को NULL के बराबर मानना ​​चाहता हूं तो मैं भी अक्सर एक समानता परीक्षण का उपयोग करता हूं जैसे:

(NULLIF(ltrim( XYZ ),'') IS NULL)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.