2010-07-27 8 views
31

Tengo una gran consulta que utiliza caso/cuando a menudo. Ahora tengo este SQL aquí, que no funciona.¿Cómo uso Case/When 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], 

¿Cuál es causar problemas xyz.somethingelseagain = 2, dice que no pudo enlazar esa expresión. xyz es un alias para una tabla que se une más abajo en la consulta. ¿Qué pasa aquí? Eliminar uno de los 2 casos/whens corrige eso, pero los necesito a ambos, probablemente aún más casos.

Respuesta

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

Obras, cuál es la diferencia? :) – grady

+2

Digamos que tengo algunos de los whens como duplicados, como este: CUANDO xyz.something = 1 y xyz.abc = 2 THEN 'SOMETEXT' CUANDO xyz.something = 1 y xyz.abc <> 2 THEN 'SOMEOTHERTEXT' ¿Puedo de alguna manera decir que si se configuró el primero cuando se salten los próximos? Algo que se escapa del caso/¿Cuándo? – grady

4

Tan pronto como una instrucción WHEN sea verdadera, la ruptura es implícita.

Deberá considerar qué expresión WHEN es la más probable que suceda. Si coloca eso CUANDO al final de una larga lista de instrucciones WHEN, su sql es probable que sea más lento. Así que colócalo como el primero.

Más información aquí: break in case statement in T-SQL

+0

Esto es cierto la mayor parte del tiempo, pero no se garantiza: 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)