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.