2011-06-27 11 views
6

Tengo 4 declaraciones de casos que son exactamente los mismos CASE criterios, pero todos tienen diferentes declaraciones THEN/ELSE.¿Es posible devolver varias columnas usando 1 declaración de caso?

¿Es posible hacer esto todo en uno, o tengo que separarlos por completo y copiar y pegar el código varias veces?

,CASE WHEN lm.Id IN ('1','2','3') THEN lm.name ELSE lm.Desc END AS [Column1] 
,CASE WHEN lm.Id IN ('1','2','3') THEN '3' ELSE '1' END AS [Column2] 
,CASE WHEN lm.Id IN ('1','2','3') THEN 'True' ELSE 'False' END AS [Column3] 

¿Es posible hacer esto con menos código?

Respuesta

9

No creo que esto sea posible en SQL estricto. Algunos motores de base de datos pueden admitirlo como una extensión. Sin embargo, probablemente puedas lograr funcionalmente lo mismo a través de otro mecanismo ... posiblemente con un JOIN o UNION.

+0

Sql Server fallará si intenta separar algo en un caso con una coma, así que lo más probable es que se quede con 3 declaraciones de casos – Limey

0

Por el ejemplo que das, no trataría de hacer ningún cambio. Si su prueba (CUANDO ... ENTONCES) implicó muchos más cálculos, o si se repitió con mucha más frecuencia, podría considerar la creación de una subconsulta para evaluarla. Pero con solo una pequeña cantidad de repetición, ¿para qué molestarse? El código que tienes es fácil de leer y no es costoso de ejecutar.

1

Sugerir UNION ing your resultsets. No obtendrá menos líneas de código, pero quizás sea más legible.

SELECT [name], '3', 'True' 
From Mytable WHERE ID IN ('1','2','3') 
UNION 
SELECT [desc], '1', 'False' 
From Mytable WHERE ID NOT IN ('1','2','3') 
+0

+1 parece ser la mejor manera de resolver este problema específico, usaría UNION ALL en su lugar para mejorar actuación –

1

¿Por qué no tratar de update la tabla usando where? En la declaración select de su pregunta, puede declarar Column1, Column2 y Column3 como NULL y con dos declaraciones update cambiar los valores.

Con "sólo" tres columnas según el mismo comunicado case debajo del código no guarda mucho escribiendo (probablemente el tiempo de ejecución ..?), Pero es muy útil cuando se tiene más de 3 ...

UPDATE MyTable 
     SET Column1 = lm.name, 
      Column2 = '3', 
      Column3 = 'True' 
WHERE lm.Id IN ('1','2','3') 

UPDATE MyTable 
     SET Column1 = lm.Desc, 
      Column2 = '1', 
      Column3 = 'False' 
WHERE lm.Id NOT IN ('1','2','3') 
Cuestiones relacionadas