2012-06-27 15 views
8

के अंदर केस स्टेटमेंट का उपयोग करना एक आईएन क्लॉज के अंदर केस स्टेटमेंट का उपयोग करना संभव है?इन क्लॉज

यह मैं क्या सही ढंग से संकलित करने के लिए प्राप्त करने की कोशिश की है की एक सरलीकृत संस्करण है:

SELECT * FROM MyTable 
WHERE StatusID IN (
CASE WHEN @StatusID = 99 THEN (5, 11, 13) 
ELSE (@StatusID) END) 

धन्यवाद!

उत्तर

21

CASE केवल एक अदिश मान देता है। आप इसके बजाय ऐसा कर सकते हैं। (मैं, यह मानते हुए हूँ अपने उदाहरण के अनुसार, यह है कि जब @StatusID = 99, 99 के एक StatusID मूल्य एक मैच नहीं है।)

select * 
from MyTable 
where (@StatusID = 99 and StatusID in (5, 11, 13)) 
    or (@StatusID <> 99 and StatusID = @StatusID) 
+1

@ LittleBobbyTables आपके नाम के साथ, मुझे यकीन है कि आप इसे पीछे के अंत में बदल सकते हैं :) – RedFilter

+0

धन्यवाद! महान समाधान! – crjunk

3

नहीं। इसके बजाय, आप यह बाहर रख सकते हैं

SELECT * 
FROM MyTable 
WHERE 1 = (CASE WHEN @StatusID = 99 and StatusId in (5, 11, 13) then 1 
       WHEN coalesce(@StatusId, 0) <> 99 and StatusId in (@StatusID) then 1 
       ELSE 0 
      END) 

आप केस स्टेटमेंट के बिना भी इसे लिख सकते हैं।

एक अन्य विकल्प है जहाँ आप वास्तव में एसक्यूएल बयान के साथ एक स्ट्रिंग बना सकते हैं और फिर इसे अमल गतिशील एसक्यूएल, है। हालांकि, गतिशील एसक्यूएल इस मामले में ओवरकिल की तरह लगता है।

+1

मैं किसी और के बैच स्टेटमेंट को पढ़ने के बाद इस वाक्यविन्यास के बारे में सोच रहा हूं, और अब मुझे पता है कि इसका उपयोग क्यों किया जाता है। महान टिप, धन्यवाद, @ गॉर्डन-लिनॉफ – Sung

0

मैंने सोचा कि मैं अलग तरह से इस प्रयास एक टेबल Valuue निर्माता का उपयोग कर चाहते हैं - tvcs के निम्नलिखित संदर्भ में अनुमति नहीं है?

SELECT * 
FROM MyTable 
WHERE StatusID IN 
    ( 
    SELECT 
     CASE 
     WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID) 
     ELSE @StatusID 
    END 
    ) 
0

आप टीवीसी का उपयोग करके ऐसा कर सकते हैं, लेकिन दृष्टिकोण थोड़ा अलग है। यह मामला उपयोग नहीं करता है, लेकिन इसे और अधिक अच्छी तरह से जहां संभव विकल्पों में से एक नंबर का चयन करने के देखते हैं स्केल करेगा से:

SELECT * 
FROM MyTable 
join (values 
     (99,5),(99,11),(99,13), 
     (@StatusID , @StatusID)  
    ) t(k,v) on t.k= @StatusID and t.v = StatusID) 

या आप जहां खंड में सब कुछ तो की जरूरत है:

SELECT * 
FROM MyTable 
WHERE exists (
    select 1 
    from (values 
     (99,5),(99,11),(99,13), 
     (@StatusID , @StatusID)  
    ) t(k,v) 
    where t.k= @StatusID and t.v = StatusID)