2010-07-27 9 views
31

मेरे पास एक बड़ी क्वेरी है जो केस/ अक्सर उपयोग करती है। अब मेरे पास यह एसक्यूएल है, जो काम नहीं करता है।मैं टी-एसक्यूएल के केस/कब उपयोग करूं?

(select case when xyz.something = 1 
then 
    'SOMETEXT' 
else 
     (select case when xyz.somethingelse = 1) 
     then 
      'SOMEOTHERTEXT' 
     end) 

     (select case when xyz.somethingelseagain = 2) 
     then 
      'SOMEOTHERTEXTGOESHERE' 
     end) 
end) [ColumnName], 

क्या मुसीबत खड़ी xyz.somethingelseagain = 2 है, यह यह है कि अभिव्यक्ति के लिए बाध्य नहीं कर सकता कहते हैं। xyz एक तालिका के लिए कुछ उपनाम है जो क्वेरी में आगे बढ़ गया है। क्या गलत है? 2 मामलों में से किसी एक को हटाने/कब इसे सुधारता है, लेकिन मुझे उनमें से दोनों की आवश्यकता है, शायद और भी अधिक मामले।

उत्तर

74
SELECT 
    CASE 
    WHEN xyz.something = 1 THEN 'SOMETEXT' 
    WHEN xyz.somethingelse = 1 THEN 'SOMEOTHERTEXT' 
    WHEN xyz.somethingelseagain = 2 THEN 'SOMEOTHERTEXTGOESHERE' 
    ELSE 'SOMETHING UNKNOWN' 
    END AS ColumnName; 
+0

काम करता है, क्या अंतर है? :) – grady

+2

आइए कहें कि मेरे पास डुप्लिकेट के रूप में कुछ समय हैं, जैसे: जब xyz.something = 1 और xyz.abc = 2 फिर 'SOMETEXT' जब xyz.something = 1 और xyz.abc <> 2 फिर 'SOMEOTHERTEXT' क्या मैं किसी भी तरह से कह सकता हूं कि अगर पहली बार सेट किया गया था कि आगामी लोग छोड़े गए हैं? कुछ जो मामले से बचता है/कब? – grady

4

जैसे ही एक WHEN कथन सत्य है तो ब्रेक अंतर्निहित है।

आपको यह समझना होगा कि जब अभिव्यक्ति सबसे अधिक होने की संभावना है। यदि आप WHEN कथन की लंबी सूची के अंत में इसे कब देते हैं, तो आपका वर्ग धीमा होने की संभावना है। तो इसे पहले के रूप में सामने रखो।

अधिक यहाँ जानकारी: break in case statement in T-SQL

+0

यह बहुत समय है, लेकिन इसकी गारंटी नहीं है: http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of-the-case-expression – RobD

0
declare @n int = 7, 
    @m int = 3; 

select 
    case 
     when @n = 1 then 
      'SOMETEXT' 
    else 
     case 
      when @m = 1 then 
       'SOMEOTHERTEXT' 
      when @m = 2 then 
       'SOMEOTHERTEXTGOESHERE' 
     end 
    end as col1 
-- n=1 => returns SOMETEXT regardless of @m 
-- n=2 and m=1 => returns SOMEOTHERTEXT 
-- n=2 and m=2 => returns SOMEOTHERTEXTGOESHERE 
-- n=2 and m>2 => returns null (no else defined for inner case)