2010-01-15 12 views
22

मैंने इस साइट को व्यापक रूप से खोजा है लेकिन समाधान नहीं मिला है।SQL सर्वर पर CASE के दौरान मैं एकाधिक कॉलम कैसे चुन सकता हूं?

SELECT 
    ActivityID, 

    Hours = (CASE 
       WHEN ActivityTypeID <> 2 THEN 
        FieldName = (Some Aggregate Sub Query), 
        FieldName2 = (Some other aggregate sub query) 
       WHEN ActivityTypeID = 2 THEN 
        FieldName = (Some Aggregate Sub Query with diff result), 
        FieldName2 = (Some Other Aggregate Sub Query with diff result) 
      END) 

स्पष्ट रूप से मैं क्वेरी का एक बहुत बाहर जा रहा हूँ, मैं सिर्फ अगर यह संभव है देखना चाहता था:

यहाँ मेरी क्वेरी का उदाहरण है।

मैं जानता हूँ कि मैं शायद सिर्फ "मामले" दो बार कर सकता है, लेकिन सोचा मैं पूछना होगा ...

धन्यवाद!

+0

संबंधित प्रश्न, लेकिन डुप्लिकेट नहीं है http://stackoverflow.com/q/13713316/2420536 –

उत्तर

26

समस्या यह है कि CASE कथन इस तरह से काम नहीं करेगा जिस तरह से आप इसका उपयोग करने का प्रयास कर रहे हैं। आप केवल एक क्वेरी में एक फ़ील्ड के मान को स्विच करने के लिए इसका उपयोग कर सकते हैं। तो मैं समझता हूँ कि तुम क्या करने की कोशिश कर रहे हैं क्या आप इस आवश्यकता हो सकती है:

SELECT 
    ActivityID, 
    FieldName = CASE 
        WHEN ActivityTypeID <> 2 THEN 
         (Some Aggregate Sub Query) 
        ELSE 
        (Some Aggregate Sub Query with diff result) 
       END, 
    FieldName2 = CASE 
        WHEN ActivityTypeID <> 2 THEN 
         (Some Aggregate Sub Query) 
        ELSE 
        (Some Aggregate Sub Query with diff result) 
       END 
12

नहीं, CASE एक फ़ंक्शन है, और केवल एक ही मूल्य लौटा सकता है। मुझे लगता है कि आपको अपने केस तर्क को डुप्लिकेट करना होगा।

दूसरा विकल्प पूरे प्रश्न को आईएफ के साथ लपेटना होगा और परिणामों को वापस करने के लिए दो अलग-अलग प्रश्न पूछना होगा। बाकी की क्वेरी को देखे बिना, यह कहना मुश्किल है कि क्या यह आपके लिए काम करेगा।

1

"प्रकरण" एकल मान ही लौट सकते हैं, लेकिन आप जटिल प्रकार का उपयोग कर सकते हैं:

create type foo as (a int, b text); 
select (case 1 when 1 then (1,'qq')::foo else (2,'ww')::foo end).*; 
+2

मुझे लगता है कि पोस्टग्रेज़ में यह संभव है, लेकिन एसक्यूएल-सर्वर नहीं है (जिसे प्रश्न टैग किया गया है) – dsz

0

वास्तव में आप क्या कर सकते हैं यह।

हालांकि, किसी को ध्यान रखना चाहिए कि CASE कथन दोहराना बुरा नहीं लगता है। SQL सर्वर का क्वेरी ऑप्टिमाइज़र CASE निष्पादित करने के लिए पर्याप्त स्मार्ट नहीं है ताकि आपको इसके कारण कोई प्रदर्शन हिट न मिले।

साथ ही, यदि कोई व्यक्ति निम्न तर्क का उपयोग कर सकते मामला दोहराना नहीं करने के लिए (अगर यह आप सूट ..)

INSERT INTO dbo.T1 
(
    Col1, 
    Col2, 
    Col3 
) 
SELECT 
    1, 
    SUBSTRING(MyCase.MergedColumns, 0, CHARINDEX('%', MyCase.MergedColumns)), 
    SUBSTRING(MyCase.MergedColumns, CHARINDEX('%', MyCase.MergedColumns) + 1, LEN(MyCase.MergedColumns) - CHARINDEX('%', MyCase.MergedColumns)) 
FROM 
    dbo.T1 t 
LEFT OUTER JOIN 
(
    SELECT CASE WHEN 1 = 1 THEN '2%3' END MergedColumns 
) AS MyCase ON 1 = 1 

यह मान दर्ज हो जाएगा (1, 2, 3) तालिका में प्रत्येक रिकॉर्ड के लिए T1। यह मर्ज किए गए कॉलम को विभाजित करने के लिए एक delimiter '%' का उपयोग करता है। आप अपनी जरूरतों के आधार पर अपना खुद का विभाजन कार्य लिख सकते हैं (उदाहरण के लिए शून्य रिकॉर्ड रिकॉर्ड करने या varchar फ़ील्ड इत्यादि के लिए जटिल डेलीमीटर का उपयोग करने के लिए)। लेकिन मुख्य तर्क यह है कि आपको CASE कथन में शामिल होना चाहिए और एक विभाजन तर्क का उपयोग करके शामिल होने के परिणाम सेट से चयन करना चाहिए।

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