2009-08-26 12 views
5

मैं कॉलम के बहुत सारे के साथ एक मेज है, मैं कॉलमएसक्यूएल गैर शून्य कॉलम कैसे ढूंढें?

ए, बी, सी, डी

इन स्तंभों में से प्रत्येक में

, किसी भी एक रिकार्ड में केवल एक स्तंभ भरा जाएगा है कहना और अन्य हमेशा नल होंगे।

मुझे एक चुनिंदा बयान की आवश्यकता है जो गैर शून्य कॉलम के कॉलम को वापस कर देगा।

मैंने सहकर्मी की कोशिश की है, लेकिन यह एक मान वापस करता है, न कि कॉलम जिस पर मूल्य है।

कोई भी ऐसा करने का सबसे आसान तरीका जानता है?

+0

एसक्यूएल प्रश्न केवल मूल्यों को वापस कर सकते हैं, कभी कॉलम नहीं। आप निश्चित रूप से कॉलम नाम के रूप में मूल्य की व्याख्या कर सकते हैं। –

+0

हाँ आप सही हैं, मैं इस बात से परेशान हूं कि एक कॉलम में एक गैर शून्य मूल्य होता है, वह कॉलम जिसमें मुझे रूचि है। – Darknight

+0

यह वास्तव में एक बुरा विचार जैसा दिखता है – finnw

उत्तर

8
SELECT 
    CASE 
     WHEN A IS NOT NULL THEN 'A' 
     WHEN B IS NOT NULL THEN 'B' 
     WHEN C IS NOT NULL THEN 'C' 
     WHEN D IS NOT NULL THEN 'D' 
    END 
FROM 
    MyTable 
+0

का विस्तार करें यह बहुत अच्छा काम करता है! कभी-कभी सरल सबसे अच्छा होता है, मुझे नहीं पता कि मैं समस्या को क्यों सोच रहा था: ओ) – Darknight

4

प्रयास मामले ...

SELECT 
CASE WHEN A IS NOT NULL THEN 'A' WHEN B IS NOT NULL THEN 'B' WHEN C IS NOT NULL THEN 'C' WHEN D IS NOT NULL THEN 'D' END as NotNullCol, OtherCols 
FROM YourTable 
+0

ठीक है, मैं इसे आजमाउंगा। – Darknight

2

सुंदर नहीं है, लेकिन यह तुम क्या चाहते है:

select case 
    when a is not null then 'a' 
    when b is not null then 'b' 
    when c is not null then 'c' 
    when d is not null then 'd' 
end 
3

जब भी आप मिल बहु कॉलम समूहों के साथ काम करने के लिए कोशिश कर रहा है, तो आप शायद आपकी स्कीमा गलत हो गई है।

ए, बी, सी और डी को अलग-अलग पंक्तियों में अलग पंक्तियों में अलग करना निश्चित रूप से आसान होगा, उन्हें मूल तालिका में पंक्ति में वापस बांधें और JOIN -type क्वेरी बनाएं।

वैकल्पिक रूप से, यदि केवल एक गैर-नल है, तो मैं दो कॉलम, प्रकार (ए, बी, सी या डी) और मान का चयन करूंगा। फिर आप प्रत्येक पंक्ति में कॉलम बर्बाद नहीं कर रहे हैं, और प्रश्नों को आसानी से आसान माना जाता है (मानते हैं कि प्रकार समान हैं)।

हालांकि, अगर आप इसे इस तरह case के साथ क्या कर सकते हैं:

select case 
    when A is not null then 'A' 
    when B is not null then 'B' 
    when C is not null then 'C' 
    else     'D' 
    end 
from ... 

वाक्य रचना बिल्कुल सही नहीं हो सकता है, तो आप इसे देखने के लिए की आवश्यकता होगी। IIt ऐसा कुछ नहीं है जो मैं आमतौर पर करता हूं क्योंकि मैं इसे एक बुरा विचार मानता हूं (प्रति में प्रति पंक्ति कार्य कभी स्केल अच्छी तरह से नहीं)।

+0

धन्यवाद इस जानकारी के लिए पैक्स, मैंने वास्तव में केवल दो कॉलम होने के बारे में सोचा था, शुरुआत में, उदाहरण के लिए: मॉड्यूल टाइप, और मॉड्यूलआईडी, लेकिन फिर मुझे एक और टेबल बनाए रखने की आवश्यकता होगी! लेकिन आप शायद स्केलिंग के बारे में सही हैं। मुझे लगता है कि इस मामले में मुझे पता है कि कॉलम बदलने के लिए बहुत ही विपरीत हैं (उदाहरण के लिए स्केल अप) – Darknight

+0

मॉड्यूल आईडी के लिए 'लुकअप' तालिका के अर्थ में एक और तालिका। भी 'nugget' टाइप किया जाना चाहिए o o: o) – Darknight

0

मैं फिर से डिजाइन करूंगा। यह लगभग संबंधित रूप से संबंधित तालिका में डेटा को स्टोर करने का एक बुरा विचार साबित होता है।

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

कम तालिकाओं का मतलब संबंधपरक डेटाबेस में तेज़ी से पहुंच या बेहतर डिज़ाइन का मतलब नहीं है। संक्षेप में डिजाइन और अनुक्रमित संबंधित टेबल आमतौर पर काफी अच्छे होते हैं। और जब आपको लगता है कि आपको कभी भी पांचवें कॉलम की आवश्यकता नहीं होगी, तो व्यवसाय नियम बदलते हैं और मैंने कई चीजें देखी हैं जिन्हें लोगों ने सोचा था कि स्केलिबिल्टी की आवश्यकता के विस्तार के लिए उन्हें विस्तार की आवश्यकता नहीं होगी।

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