2009-03-14 14 views
20

से एसक्यूएल में केस स्टेटमेंट का उपयोग करना संभव है क्या एसक्यूएल 2005 में एसक्यूएल में केस स्टेटमेंट का उपयोग करना संभव है? उदाहरण के लिए, मैं की तरह कुछ कोशिश कर रहा हूँ:क्या क्लॉज

SELECT Md5 FROM 
CASE 
    WHEN @ClientType = 'Employee' THEN @Source = 'HR' 
    WHEN @ClientType = 'Member' THEN @Source = 'Other' 
END CASE 
WHERE Current = 2; 

उत्तर

6

मान लिया जाये कि एसक्यूएल सर्वर:

आप गतिशील एसक्यूएल का उपयोग करने की आवश्यकता होगी। स्ट्रिंग बनाएं और फिर स्ट्रिंग के साथ sp_executesql को कॉल करें।

संपादित करें: बेहतर अभी तक, उचित कथन निष्पादित करने के लिए कथन का उपयोग करें और मान को एक चर के लिए असाइन करें। यदि संभव हो तो आपको गतिशील एसक्यूएल से बचना चाहिए।

0

जब से तुम क्या एसक्यूएल बैकएंड आप के खिलाफ जा रहे हैं निर्दिष्ट नहीं करते हैं, यह ठीक से जवाब देने के लिए मुश्किल हो जाएगा ....

जहां तक मैं बता सकता हूं, आप एमएस एसक्यूएल सर्वर के खिलाफ न तो इंटरबेस/फायरबर्ड के खिलाफ ऐसा करने में सक्षम नहीं होंगे। मैं अन्य बैकएंड सर्वर के लिए, हालांकि बात नहीं कर सकते हैं ...

मार्क

0

मुझे लगता है कि यह कहना जवाब कोई रास्ता नहीं है बहुत सुरक्षित है। और यह एसक्यूएल बोली के बावजूद है।

22

मुझे विश्वास नहीं है कि यह संभव है। एक बात के लिए, क्वेरी ऑप्टिमाइज़र FROM खंड में तालिका जैसी चीजों की एक विशिष्ट सूची मानते हैं। ,

SELECT md5 
FROM hr 
WHERE @clienttype = 'Employee' 
AND  current = 2 
UNION 
SELECT md5 
FROM other 
WHERE @clienttype = 'Member' 
AND  current = 2; 

केवल यूनिअन के एक आधा सच हो सकता है @clienttype विधेय दिया:

सबसे सरल समाधान का है कि मैं के बारे में सोच सकते हैं दो तालिकाओं के बीच एक संघ होगा।

+0

मैं आमतौर पर एक अगर बयान लिखते थे, लेकिन जब इस रणनीति एक साथ संयुक्त का उपयोग करते हुए 'में सम्मिलित' यह मेरे लिए होने से बचाता है सम्मिलित भाग को कई बार लिखें, इस समाधान को धन्यवाद, धन्यवाद, जब संभव हो तो अब से ऐसा कर रहा है। :) –

+0

बस ध्यान रखें कि तालिका में प्रत्येक पंक्ति के लिए 'WHERE' स्थिति निष्पादित की जाती है। तो यह एक विकल्प नहीं हो सकता है यदि स्थिति थोड़ा अधिक जटिल है और लाखों पंक्तियां हैं। –

1

नहीं, आप CASE कथन का उपयोग करके क्वेरी करने के लिए कोई तालिका नहीं चुन सकते हैं। केस स्टेटमेंट केवल अभिव्यक्तियों के भीतर जाते हैं, जैसे कॉलम के मान के लिए या आपके WHERE अभिव्यक्ति के हिस्से के रूप में।

यह है, यह क्या करना चाहिए आप देख रहे हैं सिर्फ एक ही मूल्य के लिए:

IF @ClientType = 'Employee' BEGIN 
    SET @Source = (SELECT Md5 FROM HR WHERE Current = 2) 
END 
ELSE IF @ClientType = 'Member' BEGIN 
    SET @Source = (SELECT Md5 FROM Other WHERE Current = 2) 
END 
+0

जैसा कि "लंबा हाथ" है, वही दृष्टिकोण है जो मैं लेता हूं (लेकिन कोई वोट नहीं छोड़ा गया: - /)। मैं एसक्यूएल को स्थिर रूप से उत्पन्न करने के लिए एक उपकरण का उपयोग करना चाहता हूं (जो है, रूबी की 3 लाइनें या पर्ल की 1 पंक्ति? :-) बनाम गतिशील एसक्यूएल से निपटने (जब मैं _need_ गतिशील एसक्यूएल, मुझे कुछ भी नहीं लगता है गतिशील एसक्यूएल की आवश्यकता है)। –