दिलचस्प पोस्ट
जब मेरे पास सूचीबॉक्सेज़ में मेरे पास छवियाँ हैं, तो मुझे आउटऑफ़मॉमी अपवाद क्यों मिलता है? एंड्रॉइड आयाम के बीच अंतर: pt और डीपी MySQL का TIMESTAMP बनाम टाइमस्टैंप को सीधे भंडारण करना नोडजेएस और एक्सप्रेस के साथ एन्जेलरजेएस एचटीआर 5 मेोड का उपयोग करना कर्नेल को लिनक्स के अंतर्गत चलने वाली निष्पादन योग्य बाइनरी फाइल कैसे प्राप्त होती है? कैसे धागे को साफ करने के लिए वर्तमान आवेदन से डाक, ट्विटर और फेसबुक द्वारा साझा या पोस्ट कैसे करें? Java में बतख टंकण का क्या उदाहरण है? डीजेंगो मॉडल कस्टम सहेजें () विधि में, आपको एक नया ऑब्जेक्ट कैसे पहचानना चाहिए? <a> जो किसी href को कुछ स्ट्रिंग से समाप्त होता है का चयन करें एंड्रॉइड में सूची दृश्य में क्लिक ईवेंट कैसे प्रबंधित करें? मैं WinAPI C ++ बटन की पृष्ठभूमि का रंग कैसे बदल सकता हूं रद्द पदार्थ का मूल्य ज़रूर होना चाहिए जावास्क्रिप्ट / jQuery के साथ मैं फॉर्म डेटा कैसे प्राप्त करूं? विशेष अक्षर जैसे & और <JSF घटकों के मान विशेषता में कैसे सम्मिलित करें?

खंड और शून्य मानों में नहीं

यह मुद्दा तब आया जब मुझे अलग-अलग रिकॉर्ड मिलते थे, जो मैंने सोचा था कि वे एक ही तरह के प्रश्नों का इस्तेमाल कर रहे थे not in where बाधा और अन्य एक left join । बाधा not in की मेजबानी में एक शून्य मूल्य (खराब डेटा) था जिसके कारण 0 रिकॉर्ड की गिनती वापस करने के लिए उस क्वेरी की गई थी। मुझे समझ में आ रहा है कि क्यों, लेकिन मैं कुछ सहायता का इस्तेमाल पूरी तरह से अवधारणा को समझने में कर सकता हूं।

यह बस बताए, क्यों क्यूरी ए को एक परिणाम मिलता है लेकिन बी नहीं करता?

 A: select 'true' where 3 in (1, 2, 3, null) B: select 'true' where 3 not in (1, 2, null) 

यह SQL सर्वर 2005 पर था। मुझे यह भी पता चला है कि कॉलिंग set ansi_nulls off कारण B को परिणाम लौटाता है।

Solutions Collecting From Web of "खंड और शून्य मानों में नहीं"

क्वेरी ए समान है:

 select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null 

चूंकि 3 = 3 सत्य है, आपको परिणाम मिलता है।

क्वेरी बी समान है:

 select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null 

जब ansi_nulls होता है, 3 <> null अज्ञात है, इसलिए विदग्ध अज्ञात के मूल्यांकन करता है, और आपको कोई भी पंक्तियां नहीं मिलती हैं।

जब ansi_nulls बंद होता है, 3 <> null सच है, इसलिए विधेय सच ansi_nulls है, और आपको एक पंक्ति मिलती है

जब भी आप शून्य का उपयोग करते हैं आप वास्तव में तीन मूल्यवान तर्क के साथ काम कर रहे हैं

आपकी पहली क्वेरी रिटर्न परिणाम के रूप में WHERE खंड का मूल्यांकन करता है:

  3 = 1 or 3 = 2 or 3 = 3 or 3 = null which is: FALSE or FALSE or TRUE or UNKNOWN which evaluates to TRUE 

दूसरा एक:

  3 <> 1 and 3 <> 2 and 3 <> null which evaluates to: TRUE and TRUE and UNKNOWN which evaluates to: UNKNOWN 

UNKNOWN FALSE के समान नहीं है, जिसे आप आसानी से कॉल कर परीक्षण कर सकते हैं:

 select 'true' where 3 <> null select 'true' where not (3 <> null) 

दोनों प्रश्न आपको कोई परिणाम नहीं देंगे

यदि UNKNOWN FALSE के समान था, तो मान लें कि पहली क्वेरी आपको गलत बताएगी कि दूसरे को सत्य का मूल्यांकन करना होगा क्योंकि यह ना ही (FALSE) के समान होगा।
बात वह नहीं है।

इस विषय पर SqlServerCentral पर एक बहुत अच्छा लेख है

NULLs और Three Valued Logic का पूरा अंक पहले से थोड़ा भ्रमित हो सकता है लेकिन TSQL में सही क्वेरी लिखने के लिए समझना आवश्यक है

एक और आलेख मैं सुझाऊंगा कि एसक्यूएल कुल कार्य और शून्य है

नल की तुलना अपरिभाषित है, जब तक आप IS नल का उपयोग नहीं करते हैं

इसलिए, जब 3 से न्यूल (क्वेरी ए) की तुलना करते हैं, तो यह अनिर्धारित होता है।

Ie SELECT 'true' कहां से 3 में (1,2, रिक्त) और 'सच्चे' का चयन करें जहां 3 में नहीं (1,2, रिक्त)

उसी परिणाम का उत्पादन करेगा, जैसा कि (निहित नहीं) अभी भी अपरिभाषित है, लेकिन सही नहीं है

NOT IN एक अज्ञात मूल्य के खिलाफ तुलना में 0 रिकॉर्ड रिटर्न

चूंकि NULL अज्ञात है, संभावित मूल्यों की सूची में एक NULL या NULL वाले क्वेरी में हमेशा 0 रिकॉर्ड नहीं होगा क्योंकि इस बात का कोई रास्ता नहीं है कि NULL मान की जांच की जा रही मान नहीं है।

लेखन के समय इस प्रश्न का शीर्षक है

एसक्यूएल नहीं बाधा और शून्य मूल्यों में

प्रश्न के पाठ से ऐसा प्रतीत होता है कि एसक्यूएल डीडीएल CONSTRAINT बजाय एसक्यूएल डीएमएल CONSTRAINT क्वेरी में समस्या उत्पन्न हुई थी।

हालांकि, विशेष रूप से शीर्षक के शब्दों को देखते हुए, मैं यह इंगित करना चाहता हूं कि यहां दिए गए कुछ बयान संभवतः भ्रामक बयान हैं,

जब वर्दी ने अज्ञात को मूल्यांकन किया है, तो आपको कोई भी पंक्तियां नहीं मिलती हैं।

यद्यपि यह एसक्यूएल डीएमएल के लिए मामला है, जब बाधाओं पर विचार प्रभाव अलग है

इस बहुत सरल तालिका को दो प्रश्नों के साथ सीधे प्रश्न के मुताबिक उठाए गए हैं (और @ ब्रेनन द्वारा उत्कृष्ट उत्तर में संबोधित किया गया है):

 DECLARE @T TABLE ( true CHAR(4) DEFAULT 'true' NOT NULL, CHECK ( 3 IN (1, 2, 3, NULL )), CHECK ( 3 NOT IN (1, 2, NULL )) ); INSERT INTO @T VALUES ('true'); SELECT COUNT(*) AS tally FROM @T; 

@ ब्रानन के उत्तर के अनुसार, पहली बाधा ( IN उपयोग से) सच मानता है और दूसरी बाधा (बिना उपयोग NOT IN ) अज्ञात करने के लिए मूल्यांकन करती है हालांकि , डालने सफल होता है! इसलिए, इस मामले में यह कहने के लिए कड़ाई से सही नहीं है, "आपको कोई पंक्तियां नहीं मिलतीं" क्योंकि हमने वास्तव में परिणाम के रूप में एक पंक्ति डाली है

उपरोक्त प्रभाव वास्तव में एसक्यूएल -92 मानक के संबंध में सही है। SQL-92 स्पेस से निम्न अनुभाग की तुलना करें और इसके विपरीत करें

7.6 जहां खंड

इसका परिणाम टी की उन पंक्तियों की एक तालिका है जिसके लिए खोज स्थिति का नतीजा सही है।

4.10 अखंडता की कमी

एक तालिका की जांच बाधा संतोषजनक है अगर और यदि केवल निर्दिष्ट खोज स्थिति तालिका के किसी भी पंक्ति के लिए गलत नहीं है।

दूसरे शब्दों में:

एसक्यूएल डीएमएल में, पंक्तियों को परिणाम से निकाल दिया जाता है जब WHERE मूल्यांकन करता है क्योंकि यह स्थिति "सच है" को संतुष्ट नहीं करता है

एसक्यूएल डीडीएल (अर्थात् बाधाओं) में, पंक्तियों को परिणाम से निकाल नहीं दिया जाता है जब वे UNKNOWN के मूल्यांकन करते हैं क्योंकि यह शर्त को संतुष्ट करता है "गलत नहीं है"

यद्यपि एसक्यूएल डीएमएल और एसक्यूएल डीडीएल में प्रभाव क्रमशः प्रतीत हो सकता है, लेकिन UNKNOWN परिणामों को बाधाओं को संतुष्ट करने की अनुमति देकर 'संदेह का लाभ' देने के लिए व्यावहारिक कारण है (अधिक सही तरीके से, उन्हें बाधा को संतुष्ट करने में असफल होने की अनुमति नहीं) : इस व्यवहार के बिना, प्रत्येक बाधाओं को स्पष्ट रूप से संभाल लेना होगा और यह भाषा डिजाइन परिप्रेक्ष्य से बहुत असंतोषजनक होगा (उल्लेख नहीं करने के लिए, कोडर्स के लिए सही दर्द!)

ps यदि आप इसे ऐसे तर्क का पालन करने के लिए चुनौतीपूर्ण समझते हैं जैसे "अज्ञात किसी बाधा को संतुष्ट करने में असफल नहीं होता" जैसा मैं लिख रहा हूं, तो मान लें कि आप एसक्यूएल डीडीएल में अशक्त कॉलम से बचने और एसक्यूएल में कुछ भी डीएमएल जो नल का उत्पादन करता है (जैसे बाह्य जोड़ता है)!

ए में, 3 सेट के प्रत्येक सदस्य के खिलाफ समानता के लिए परीक्षण किया जाता है, उपज (FALSE, FALSE, TRUE, UNKNOWN)। चूंकि तत्वों में से एक सत्य है, इसलिए स्थिति सही है। (यह भी संभव है कि कुछ शॉर्ट-सर्किट यहां जगह ले लेते हैं, इसलिए यह वास्तव में बंद हो जाता है जैसे कि यह पहली ट्रू को मारता है और कभी भी 3 = नल का मूल्यांकन नहीं करता है।)

बी में, मुझे लगता है कि यह शर्त के रूप में मूल्यांकन नहीं है (3 में (1,2, शून्य)) सेट उपज (FALSE, FALSE, UNKNOWN) के खिलाफ समानता के लिए परीक्षण 3, जिसे UNKNOWN में एकत्रित किया गया है। नहीं (अज्ञात) UNKNOWN पैदावार तो पूरी तरह से स्थिति की सच्चाई अज्ञात है, जो अंत में अनिवार्य रूप से गलत रूप में माना जाता है।

शून्य का प्रतीक है और डेटा की अनुपस्थिति, वह यह अज्ञात है, कुछ नहीं के डेटा मान नहीं है यह प्रोग्रामिंग पृष्ठभूमि से लोगों को भ्रमित करने के लिए बहुत आसान है क्योंकि सी टाइप भाषाओं में पॉइंटर्स रिक्त का उपयोग करते समय वास्तव में कुछ भी नहीं है

इसलिए पहले मामले में 3 वास्तव में (1,2,3, शून्य) के सेट में है, इसलिए सच वापस किया जाता है

दूसरे में आप इसे कम कर सकते हैं

'सच्चे' का चयन करें जहां 3 न (शून्य)

इसलिए कुछ भी नहीं लौटाया जाता है क्योंकि पार्सर उस सेट के बारे में कुछ भी नहीं जानता जिसके लिए आप इसकी तुलना कर रहे हैं – यह एक खाली सेट नहीं है लेकिन एक अज्ञात सेट है। (1, 2, शून्य) का उपयोग करने में मदद नहीं करता क्योंकि (1,2) सेट स्पष्ट रूप से झूठे है, लेकिन फिर आप और 'अज्ञात के खिलाफ हैं, जो अज्ञात है।

यदि आप एक subquery containg NULLs के लिए NOT IN के साथ फ़िल्टर करना चाहते हैं तो नल नहीं के लिए justcheck

 SELECT blah FROM t WHERE blah NOT IN (SELECT someotherBlah FROM t2 WHERE someotherBlah IS NOT NULL ) 

यह उत्तर से निष्कर्ष निकाला जा सकता है कि NOT IN (subquery) सही ढंग से नाल को संभाल नहीं करता है और NOT EXISTS पक्ष में से बचा जाना चाहिए हालांकि, ऐसा निष्कर्ष समयपूर्व हो सकता है। निम्नलिखित परिदृश्य में क्रिस डेटी (डाटाबेस प्रोग्रामिंग एंड डिज़ाईन, वॉल 2 नो 9, सितंबर 1 9 8) को श्रेय दिया गया है, यह सही NOT IN है और सही परिणाम देता है, न कि NOT EXISTS बजाय।

आपूर्तिकर्ताओं ( sno ) का प्रतिनिधित्व करने वाले एक टेबल pno पर विचार करें जो कि मात्रा ( pno ) मात्रा में ( qty ) आपूर्ति करने के लिए जाने जाते हैं तालिका वर्तमान में निम्नलिखित मान रखती है:

  VALUES ('S1', 'P1', NULL), ('S2', 'P1', 200), ('S3', 'P1', 1000) 

ध्यान दें कि मात्रा नल है यानी यह कि इस तथ्य को रिकॉर्ड करने में सक्षम होने के लिए कि आपूर्तिकर्ता भागों की आपूर्ति के लिए जाना जाता है, भले ही यह ज्ञात नहीं हो कि किस मात्रा में क्या पता है।

यह काम आपूर्तिकर्ताओं को मिल रहा है जो आपूर्ति भाग संख्या 'पी 1' ज्ञात हैं लेकिन 1000 की मात्रा में नहीं हैं

निम्नलिखित NOT IN केवल आपूर्तिकर्ता 'एस 2' को सही ढंग से पहचानने NOT IN उपयोग NOT IN गया है:

 WITH sp AS ( SELECT * FROM ( VALUES ( 'S1', 'P1', NULL ), ( 'S2', 'P1', 200 ), ( 'S3', 'P1', 1000 ) ) AS T ( sno, pno, qty ) ) SELECT DISTINCT spx.sno FROM sp spx WHERE spx.pno = 'P1' AND 1000 NOT IN ( SELECT spy.qty FROM sp spy WHERE spy.sno = spx.sno AND spy.pno = 'P1' ); 

हालांकि, नीचे की क्वेरी एक ही सामान्य संरचना का उपयोग करती है लेकिन NOT EXISTS साथ, लेकिन परिणामस्वरूप गलत तरीके से आपूर्तिकर्ता 'एस 1' शामिल है (यानी जिसके लिए मात्रा शून्य है):

 WITH sp AS ( SELECT * FROM ( VALUES ( 'S1', 'P1', NULL ), ( 'S2', 'P1', 200 ), ( 'S3', 'P1', 1000 ) ) AS T ( sno, pno, qty ) ) SELECT DISTINCT spx.sno FROM sp spx WHERE spx.pno = 'P1' AND NOT EXISTS ( SELECT * FROM sp spy WHERE spy.sno = spx.sno AND spy.pno = 'P1' AND spy.qty = 1000 ); 

तो ऐसा NOT EXISTS है कि यह रजत बुलेट दिखाई दे सकता है!

बेशक, समस्या का स्रोत नल की उपस्थिति है, इसलिए 'असली' समाधान उन नल को खत्म करना है।

यह दो तालिकाओं का उपयोग करते हुए (अन्य संभावित डिजाइनों के बीच) प्राप्त किया जा सकता है:

  • sp आपूर्तिकर्ताओं भागों की आपूर्ति करने के लिए जाना जाता है
  • ज्ञात मात्रा में भागों की आपूर्ति के लिए जाना जाता है spq आपूर्तिकर्ताओं

ध्यान दें कि शायद एक विदेशी कुंजी बाधा होनी चाहिए जहां spq संदर्भ sp

नतीज तब 'शून्य' रिलेशनल ऑपरेटर (मानक एसक्यूएल में EXCEPT कीवर्ड में) का प्रयोग करके प्राप्त किया जा सकता है

 WITH sp AS ( SELECT * FROM ( VALUES ( 'S1', 'P1' ), ( 'S2', 'P1' ), ( 'S3', 'P1' ) ) AS T ( sno, pno ) ), spq AS ( SELECT * FROM ( VALUES ( 'S2', 'P1', 200 ), ( 'S3', 'P1', 1000 ) ) AS T ( sno, pno, qty ) ) SELECT sno FROM spq WHERE pno = 'P1' EXCEPT SELECT sno FROM spq WHERE pno = 'P1' AND qty = 1000; 

यह भी उपयोग में शामिल होने, मौजूद और http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx के बीच तार्किक अंतर जानने के लिए उपयोग में हो सकता है

यह लड़के के लिए है:

 select party_code from abc as a where party_code not in (select party_code from xyz where party_code = a.party_code); 

यह एन्टी सेटिंग्स की परवाह किए बिना काम करता है