NULL वाले सेट के साथ IN IN हमेशा FALSE / NULL क्यों नहीं लौटता है?


21

मेरे पास एक क्वेरी थी (उपसर्ग वाले पोस्टग्रेज और इंफॉर्मिक्स के लिए) NOT INजिसमें एक उपश्रेणी थी जिसमें कुछ मामलों में NULLमान लौटाए गए थे , जिसके कारण वह खंड (और संपूर्ण क्वेरी) कुछ भी वापस करने में विफल रहा।

इसे समझने का सबसे अच्छा तरीका क्या है? मैंने NULLबिना मूल्य के कुछ के रूप में सोचा , और इसलिए क्वेरी के असफल होने की उम्मीद नहीं थी, लेकिन जाहिर है कि यह सोचने का सही तरीका नहीं है NULL।

जवाबों:


29

बूलियन तर्क - या तीन मूल्यवान तर्क

  • IN OR स्थितियों की एक श्रृंखला के लिए आशुलिपि है
  • x NOT IN (1, 2, NULL) के समान है NOT (x = 1 OR x = 2 OR x = NULL)
  • ... के समान है x <> 1 AND x <> 2 AND x <> NULL
  • ... true AND true AND unknown** के समान है
  • ... = unknown**
  • ... जो falseइस मामले में लगभग वैसा ही है क्योंकि यह WHEREशर्त को नहीं पास करेगा **

अब, इस कारण लोक उपयोग EXISTS+ के NOT EXISTSबजाय IN+ है NOT IN। अधिक के लिए अनुक्रमित के संबंध में NOT तर्क का उपयोग भी देखें

** नोट: एक स्थिति में एक अभिव्यक्ति के अंत में के unknownरूप falseमें ही है WHERE।
जबकि अभिव्यक्ति का मूल्यांकन किया जा रहा है, तो यह अज्ञात है कि
@ kgrittn की टिप्पणी नीचे क्यों दी गई है


10
स्पष्टीकरण के साथ भी यह तकनीकी रूप से गलत है, और एक तरह से जो किसी को जला सकता है। उदाहरण के लिए, यदि आप x <> NULLसमाधान के रूप में देखते हैं, तो आप इसका मूल्यांकन करने की FALSEअपेक्षा करेंगे , और ऐसा नहीं है। दोनों का मूल्यांकन । चाल यह है कि एक पंक्ति का चयन केवल तभी किया जाता है यदि खंड (यदि वर्तमान) का मूल्यांकन करता है - यदि पंक्ति या तो खंड का मूल्यांकन करती है तो एक पंक्ति छोड़ दी जाती है । यह व्यवहार (सामान्य रूप से, और विशेष रूप से विधेय के लिए ) SQL मानक द्वारा अनिवार्य है। NOT (x <> NULL)TRUEUNKNOWNWHERETRUEFALSEUNKNOWNNOT IN
— कीर्तिदान

इसके अलावा NULL NOT IN (some_subquery)बाहरी पंक्ति को वापस नहीं करना चाहिए, अगर some_subqueryकोई पंक्तियाँ वापस नहीं आती हैं। यही कारण है कि निष्पादन योजना जब दोनों स्तंभ नल-सक्षम हैं तो काफी अधिक महंगा हो सकता है। SQL सर्वर उदाहरण
— मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.