2012-01-03 16 views
16

मुझे यह जांचना होगा कि मेरे SQL कथन में कोई कॉलम पूर्ण नहीं है या नहीं।जांचें कि कोई कॉलम शून्य नहीं है

मेरे SQL क्वेरी:

select column_a, column_b, column_c, column_d, column_x 
from myTable 

मैं अपने चयन में स्तंभों की एक बहुत कुछ किया है। तो मैं एक प्रदर्शन मुद्दा मिल गया है, अगर मैं निम्नलिखित करना होगा:

select column_a, column_b, column_c, column_d, column_x 
from myTable 
where column_a is not null or column_b is not null or column_c is not null 
or column_x is not null 

एक और (बेहतर) अगर वहाँ किसी भी स्तंभ को शून्य नहीं कर रहे हैं की जाँच करने के तरीका है?

+1

आप ऐसा क्यों कहते हैं कि यह एक प्रदर्शन समस्या है? क्या इनमें से अधिकतर कॉलम मान वास्तव में 'नल' हैं, इसलिए यह अनावश्यक पंक्तियों को स्कैन कर रहा है? आप इस निष्कर्ष पर कैसे आए हैं? –

+0

आप कम से कम एनयूएलएल वाले कॉलम डाल सकते हैं? सभी कॉलम पर एक सूचकांक के बारे में कैसे? –

+0

क्या आप जानना चाहते हैं कि किसी भी कॉलम में एक पूर्ण मान है (जैसा कि प्रश्न शीर्षक और प्रश्न निकाय में बताया गया है), या क्या कोई कॉलम ** ** ** के पास एक पूर्ण मान नहीं है (जैसा कि आपकी SQL क्वेरी में लिखा गया है)। दो पूरी तरह से अलग प्रश्न। – RedFilter

उत्तर

22

आप इसके लिए COALESCE का उपयोग कर सकते हैं। COALESCE पहला गैर-शून्य मान देता है, यदि कोई हो। यह संभवतः कोई बेहतर प्रदर्शन नहीं करेगा, लेकिन यह अधिक पढ़ने योग्य है।

उदाहरण:

where coalesce(column_a, column_b, column_c, column_x) is not null 

अपने डेटा की प्रमुखता के आधार पर आप प्रदर्शन में मदद करने के अनुक्रमित जोड़ने में सक्षम हो सकता है।

एक और संभावना निरंतर गणना वाले कॉलम का उपयोग करना है जो आपको बताती है कि सभी चार कॉलम पूर्ण हैं या नहीं।

+1

आप * * कर सकते हैं लेकिन आप नहीं जानते कि कौन सा कॉलम शून्य है (सिवाय इसके कि एक नल परिणाम का मतलब है कि वे सभी हैं)। यदि ओपी हर कॉलम की पुष्टि करना चाहता है तो शून्य है, तो एक COALESCE अच्छी तरह से काम करेगा। हालांकि, यह पता लगाने का एक संक्षिप्त तरीका नहीं होगा कि * कोई * कॉलम शून्य है या नहीं। –

+3

@ ब्रैड: ओपी चुन रहा है जहां कोई कॉलम ** ** शून्य नहीं है। 'COALESCE' इसके लिए पूरी तरह से काम करता है और मूल क्वेरी की तुलना में कम या ज्यादा जानकारी प्रदान नहीं करता है। – RedFilter

+1

मैं इस सवाल को समझ रहा हूं कि "इनमें से कोई भी कॉलम शून्य है या नहीं, तो मैं कैसे पता लगा सकता हूं"। एक COALESCE आपको यह बताने वाला नहीं है कि एक कॉलम शून्य है, बस कम से कम एक या सभी नहीं हैं। तो जब तक पहला कॉलम शून्य न हो, तब तक आप वास्तव में अगले तीन पर एक परीक्षण को अनदेखा कर रहे हैं। (इसी तरह पिछले दो के मुकाबले पहले दो के लिए, और इसी तरह)। शायद मैं इस सवाल को गलत समझ रहा हूं। –

2

इस पर हमला करने का एक तरीका एक अतिरिक्त बिट कॉलम जोड़ना है जो ट्रैक करता है कि कोई मूल्य है या नहीं।

पेशेवरों

  • चलाता साथ लागू किया जा सकता है ताकि आप अपने कोड के बाकी
  • अन्य स्तंभों
  • कि स्तंभ अनुक्रमित किया जा सकता स्कैनिंग की आवश्यकता नहीं है को बदलने की जरूरत नहीं है

विपक्ष

  • आपका डाटा को डी-सामान्यीकृत किया जाएगा
  • अधिक जटिल/अधिक रखरखाव
  • अधिक अतिरिक्त स्तंभ

के लिए संग्रहण स्थान पेशेवरों पल्ला झुकना चाहे विपक्ष एक प्रदर्शन की आप कितना हिट पर निर्भर अन्य कॉलम देखकर ले रहे हैं। इसे करने से पहले प्रोफाइल करें!

+0

इंडेक्स का उपयोग तब तक नहीं किया जाएगा जब तक कि यह लुकअप की लागत के कारण 'कॉलम_ए, कॉलम_बी, कॉलम_एम, कॉलम_डी, कॉलम_एक्स' को कवर न किया जाए, जब तक कि वे असामान्य स्थिति में न हों, जहां यह अधिकांश कॉलम के लिए 'न्यूल' था पंक्तियों के साथ-साथ 'नल न्यूल' मानदंडों के साथ फ़िल्टर किए गए इंडेक्स या अनुक्रमित दृश्य का भी उपयोग कर सकते हैं। –

+0

हाय आरक्यूडीक्यू, आपके उत्तर के लिए धन्यवाद। मुझे लगता है कि यह एक बड़ा ओवरहेड है, अगर मैं इस मूल्य के लिए एक अलग कॉलम करता हूं। शायद एक समशीतोष्ण तालिका के साथ एसक्यूएल क्वेरी में? – bitsmuggler

2

मुझे आम तौर पर कोलेसेस के रेडफिल्टर के सुझाव पसंद हैं, लेकिन एक और समाधान CHECKSUM() फ़ंक्शन का उपयोग करना हो सकता है। बेशक, सभी एनयूएलएल के लिए चेकसम का मूल्य कॉलम और डेटाटाइप पर निर्भर करता है, इसलिए आपको उस मान को प्राप्त करने के लिए पहले एक क्वेरी चलाने की आवश्यकता होगी। की तरह कुछ:

select CHECKSUM(*) AS [All_NULL_Value] 
from myTable 
where column_a is null 
AND column_b is null 
AND column_c is null 
AND column_d is null 
AND column_x is null 

तो फिर तुम यह कर सकते हैं:

select column_a, column_b, column_c, column_d, column_x 
from myTable 
where CHECKSUM(*) <> {All_NULL_Value_obtained_above} 

मैं अगर यह अच्छा है या COALESCE विचार तुलना में खराब प्रदर्शन लेकिन एक कोशिश के लायक हो सकता है यकीन नहीं है।

0

उत्तर 5 साल पहले स्वीकार किया गया था, लेकिन जैसा कि ब्रैड ने कहा था, प्रश्न शीर्षक सहकर्मी गलत दृष्टिकोण है। यदि कुछ मामलों में आपको वास्तव में जांचना है या कोई पैरामीटर शून्य है, तो आप इसका उपयोग कर सकते हैं:

where convert(binary, column_a) + convert(binary, column_b) + convert(binary, column_c), + convert(binary, column_k) is null 
+0

"सहकर्मी गलत दृष्टिकोण है" क्यों? –

संबंधित मुद्दे