2010-01-15 19 views
22

He buscado este sitio extensamente pero no puedo encontrar una solución.¿Cómo puedo SELECCIONAR varias columnas dentro de un CASO CUANDO en SQL Server?

Aquí está el ejemplo de mi consulta:

SELECT 
    ActivityID, 

    Hours = (CASE 
       WHEN ActivityTypeID <> 2 THEN 
        FieldName = (Some Aggregate Sub Query), 
        FieldName2 = (Some other aggregate sub query) 
       WHEN ActivityTypeID = 2 THEN 
        FieldName = (Some Aggregate Sub Query with diff result), 
        FieldName2 = (Some Other Aggregate Sub Query with diff result) 
      END) 

obviamente me voy a cabo una gran cantidad de la consulta, sólo quería ver si es posible.

Sé que probablemente sólo podría hacer el "caso" dos veces, pero pensé que pediría ...

Gracias!

+0

Pregunta relacionada, pero NO un duplicado es http://stackoverflow.com/q/13713316/2420536 –

Respuesta

26

El problema es que la instrucción CASE no funcionará en la forma en que intentas usarla. Solo puede usarlo para cambiar el valor de un campo en una consulta. Si entiendo lo que estás tratando de hacer, es posible que tenga esto:

SELECT 
    ActivityID, 
    FieldName = CASE 
        WHEN ActivityTypeID <> 2 THEN 
         (Some Aggregate Sub Query) 
        ELSE 
        (Some Aggregate Sub Query with diff result) 
       END, 
    FieldName2 = CASE 
        WHEN ActivityTypeID <> 2 THEN 
         (Some Aggregate Sub Query) 
        ELSE 
        (Some Aggregate Sub Query with diff result) 
       END 
12

No, CASE es una función que solo puede devolver un valor. Creo que vas a tener que duplicar tu lógica CASE.

La otra opción sería envolver toda la consulta con un IF y tener dos consultas separadas para devolver los resultados. Sin ver el resto de la consulta, es difícil decir si eso funcionaría para usted.

1

"Caso" sólo puede devolver un solo valor, pero se puede utilizar el tipo de complejo:

create type foo as (a int, b text); 
select (case 1 when 1 then (1,'qq')::foo else (2,'ww')::foo end).*; 
+2

Creo que es posible en Postgres, pero no en el servidor sql (con el que está etiquetada la pregunta) – dsz

0

En realidad se puede hacer eso.

Aunque, alguien debe tener en cuenta que repetir las declaraciones CASE no está mal como parece. El optimizador de consultas de SQL Server es lo suficientemente inteligente como para no ejecutar el CASE dos veces para que no obtenga ningún golpe de rendimiento debido a eso.

Además, alguien podría usar la siguiente lógica para no repetir la caja (si lo que necesite ..)

INSERT INTO dbo.T1 
(
    Col1, 
    Col2, 
    Col3 
) 
SELECT 
    1, 
    SUBSTRING(MyCase.MergedColumns, 0, CHARINDEX('%', MyCase.MergedColumns)), 
    SUBSTRING(MyCase.MergedColumns, CHARINDEX('%', MyCase.MergedColumns) + 1, LEN(MyCase.MergedColumns) - CHARINDEX('%', MyCase.MergedColumns)) 
FROM 
    dbo.T1 t 
LEFT OUTER JOIN 
(
    SELECT CASE WHEN 1 = 1 THEN '2%3' END MergedColumns 
) AS MyCase ON 1 = 1 

Esto insertará los valores (1, 2, 3) para cada registro de la tabla T1. Utiliza un delimitador '%' para dividir las columnas fusionadas. Puede escribir su propia función dividida según sus necesidades (por ejemplo, para manejar registros nulos o usar el delimitador complejo para campos varchar, etc.). Pero la lógica principal es que debe unirse a la declaración CASE y seleccionar desde el conjunto de resultados de la unión con una lógica dividida.

Cuestiones relacionadas