2010-07-27 4 views
31

J'ai une requête énorme qui utilise cas/quand souvent. Maintenant, j'ai ce SQL ici, qui ne fonctionne pas.Comment utiliser le cas/quand de T-SQL?

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

ce qui cause problème est xyz.somethingelseagain = 2, il dit qu'il ne pouvait pas lier cette expression. xyz est un alias pour une table qui est jointe plus bas dans la requête. Qu'est-ce qui ne va pas ici? Enlever l'un des 2 cas/whens corrige cela, mais j'ai besoin des deux, probablement encore plus de cas.

Répondre

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, ce qui est la différence? :) – grady

+2

Disons que j'ai quelques-uns des whens comme des doublons, comme ceci: QUAND xyz.something = 1 et xyz.abc = 2 ALORS 'someText' QUAND xyz.something = 1 et xyz.abc <> 2 ALORS 'SOMEOTHERTEXT' Puis-je d'une manière ou d'une autre dire que si le premier a été réglé, les prochains seront sautés? Quelque chose qui échappe à l'affaire/quand? – grady

4

Dès qu'une instruction WHEN est vraie, la rupture est implicite.

Vous devrez déterminer quelle est l'expression la plus susceptible de se produire. Si vous mettez ce WHEN à la fin d'une longue liste d'instructions WHEN, votre SQL sera probablement plus lent. Donc, mettez-le en avant comme le premier.

Plus d'informations ici: break in case statement in T-SQL

+0

Ceci est vrai la plupart du temps, mais n'est pas garanti: 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)