varios varias valores una mismo misma condiciones condicion con columna campo sql-server select case-when

valores - ¿Cómo puedo SELECCIONAR varias columnas dentro de un CASO CUANDO en SQL Server?



where con varias condiciones mysql (4)

He buscado este sitio extensamente pero no puedo encontrar una solución.

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 estoy dejando de lado la consulta, solo quería ver si es posible.

Sé que probablemente podría hacer el "CASO" dos veces, pero pensé que podría preguntar ...

¡Gracias!


"Caso" puede devolver solo valor único, pero puede usar el tipo complejo:

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


El problema es que la declaració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 necesites 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


En realidad puedes hacerlo.

Aunque, alguien debería notar que repetir las declaraciones CASE no es malo como parece. El optimizador de consultas de SQL Server es lo suficientemente inteligente como para no ejecutar el CASE dos veces, por lo que no obtendrá ningún golpe de rendimiento debido a eso.

Además, alguien puede usar la siguiente lógica para no repetir el CASO (si le conviene ...)

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 en la tabla T1 . Utiliza un delimitador ''%'' para dividir las columnas combinadas. Puede escribir su propia función de división dependiendo de sus necesidades (por ejemplo, para manejar registros nulos o usar delimitador complejo para campos varchar , etc.). Pero la lógica principal es que debe unirse a la instrucción CASE y seleccionar del conjunto de resultados de la unión con una lógica dividida.


No, CASE es una función y solo puede devolver un solo 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.