2013-01-23 36 views
9

मैं एक क्वेरी बनाने की कोशिश कर रहा हूं जो सभी पंक्तियों को वापस कर देगी जिनमें 1 कॉलम पर शून्य मूल्य है। कुछ पंक्तियों में कहीं एक से अधिक शून्य प्रविष्टि होगी। एक कॉलम है जिसे मैं बाहर करना चाहता हूं, क्योंकि इस समय इस समय सभी प्रविष्टियां शून्य हैं और यह एकमात्र कॉलम है जिसे शून्य मान रखने की अनुमति है। मैं फंस गया हूं क्योंकि मुझे नहीं पता कि WHERE में सभी कॉलम कैसे शामिल करें।किसी भी कॉलम में शून्य मूल्यों के साथ सभी पंक्तियां खोजें

SELECT * 
FROM Analytics 
WHERE * IS NULL 

वैकल्पिक रूप से, मैं एक कॉलम के लिए गिनती कर सकता हूं, लेकिन तालिका में लगभग 67 कॉलम हैं।

SELECT COUNT(*) 
FROM Analytics 
WHERE P_Id IS NULL 
+0

आपको इसे मैन्युअल रूप से करना है। आपको सभी कॉलम सूचीबद्ध करने की आवश्यकता है। आप इसे टीएसक्यूएल के साथ उत्पन्न कर सकते हैं और टेबल स्कीमा को देखकर इसे निष्पादित कर सकते हैं फिर टीएसक्यूएल उत्पन्न कर सकते हैं जो सभी 67 कॉलम सूचीबद्ध करता है। लेकिन एक ही कथन में एकाधिक कॉलम के खिलाफ मूल्यों की जांच करने का कोई आसान तरीका नहीं है जैसे '* IS NULL' –

+5

आप क्या आरडीबीएमएस और संस्करण का उपयोग कर रहे हैं? – Lamak

+0

यह एसक्यूएल सर्वर 2005 है: '[। मुझे लगा कि मुझे इसे व्यक्तिगत रूप से करना पड़ सकता है। –

उत्तर

8

एसक्यूएल सर्वर में आप this answer

;WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' as ns) 
SELECT * 
FROM Analytics 
WHERE (SELECT Analytics.* 
     FOR xml path('row'), elements xsinil, type 
     ).value('count(//*[local-name() != "colToIgnore"]/@ns:nil)', 'int') > 0 

SQL Fiddle

से विचार उधार ले सकते हैं संभावना एक प्रश्न के निर्माण के रूप में keyColumn फ़िल्टर कर दिया है 67 कॉलम अधिक कुशल होंगे लेकिन यह कुछ टाइपिंग बचाता है या इसे उत्पन्न करने के लिए गतिशील एसक्यूएल की आवश्यकता है।

0

पर जो RDBMS आप उपयोग कर रहे निर्भर करता है, मुझे लगता है कि अपने ही एकमात्र विकल्प (बजाय स्पष्ट रूप से WHERE col1 IS NULL and col2 IS NULL and col3 IS NULL ... कह) गतिशील एसक्यूएल उपयोग करने के लिए किया जाएगा।

उदाहरण के लिए, यदि आप एक SQL सर्वर डेटाबेस से सभी कॉलम नामों में प्राप्त करना चाहते हैं, तो आप कुछ इस तरह इस्तेमाल कर सकते हैं उन नामों वापस जाने के लिए:

SELECT 
    name 
FROM 
    sys.columns 
WHERE 
    object_id = OBJECT_ID('DB.Schema.Table') 

आप XML के लिए इस्तेमाल कर सकते हैं अपने कहां खंड बनाने के लिए :

SELECT Name + ' IS NULL AND ' AS [text()] 
FROM sys.columns c1 
WHERE  object_id = OBJECT_ID('DB.Schema.Table') 
ORDER BY Name 
FOR XML PATH('') 

उम्मीद है कि यह आपको प्रारंभ करने में मदद करता है।

शुभकामनाएं।

+0

मैं इस बारे में सोच रहा था लेकिन क्या आप परिणाम को एक अस्थायी तालिका में डाल सकते हैं? –

0

मेरे पास परीक्षण करने के लिए ऐसी कोई तालिका नहीं है, मान लीजिए कि 'x' किसी भी क्षेत्र में डेटा के रूप में नहीं है, मुझे लगता है कि यह Sql-Server पर काम करना चाहिए; (DEMO)

नोट: मैंc.name != 'keyColumn'

DECLARE @S NVARCHAR(max), @Columns VARCHAR(50), @Table VARCHAR(50) 

SELECT @Columns = '66', --Number of cols without keyColumn 
     @Table = 'myTable' 

SELECT @S = ISNULL(@S+'+ ','') + 'isnull(convert(nvarchar, ' + c.name + '),''x'')' 
FROM sys.all_columns c 
WHERE c.object_id = OBJECT_ID(@Table) AND c.name != 'keyColumn' 

exec('select * from '[email protected]+' where ' + @S + '= replicate(''x'',' + @Columns + ')') 

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

  • कोई संबंधित समस्या नहीं^_^