2010-07-27 3 views
31

Ich habe eine große Abfrage, die Fall verwendet/wenn oft. Jetzt habe ich diese SQL hier, die nicht funktioniert.Wie benutze ich T-SQL's Fall/Wann?

(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], 

Was Ärger verursacht xyz.somethingelseagain = 2 ist, sagt er es nicht, dass die Expression binden konnte. xyz ist ein Alias ​​für eine Tabelle, die in der Abfrage weiter unten eingefügt wird. Was ist hier falsch? Das Entfernen eines der beiden Fälle korrigiert das, aber ich brauche beide, wahrscheinlich noch mehr Fälle.

Antwort

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

Works, was ist der Unterschied? :) – grady

+2

Lets sagen, ich habe einige der when als Duplikate, wie folgt: WENN xyz.something = 1 und xyz.abc = 2 DANN 'SOMETEXT' WENN xyz.etwas = 1 und xyz.abc <> 2 DANN 'SOMEOTHERTEXT' Kann ich irgendwie sagen, wenn die erste wann eingestellt wurde, dass die kommenden übersprungen werden? Etwas, das dem Fall entgeht/wann? – grady

4

Sobald eine WHEN-Anweisung wahr ist, ist die Pause implizit.

Sie müssen überlegen, welcher Ausdruck am wahrscheinlichsten ist. Wenn Sie das WHEN am Ende einer langen Liste von WHEN-Anweisungen angeben, ist Ihr SQL wahrscheinlich langsamer. Also stell es als erstes auf.

Weitere Informationen hier: break in case statement in T-SQL

+0

Das ist oft der Fall, aber es ist nicht garantiert: 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)