uso transact listado instrucciones funciones ejemplos consultas basicas agregadas sql sql-server sql-server-2005 tsql case

transact - TSQL: utilice una columna de selección derivada en la cláusula Where



listado de funciones en sql server (6)

¿Hay alguna forma en TSQL de hacer algo como esto?

select a,b,c, case when a=1 then 5 when a=2 then 6 end as d from some_table where d=6

La declaración del caso real es realmente compleja, ¿por lo que estoy tratando de evitar repetirla en la cláusula where? ¿Hay algún truco para hacer esto?

(Creo que hay un truco en MySQL para usar "tener d = 6").


Este es un buen lugar para usar CTE , por ejemplo:

WITH MassagedData (a, b, c, d) AS ( select a, b, c, case when a=1 then 5 when a=2 then 6 end as d from some_table ) SELECT a,b,c FROM MassagedData where d=6


Haga de su consulta publicada una subconsulta y seleccione desde donde d = 6. Por lo que sé, no hay forma de hacer referencia a una columna derivada en la misma consulta.


select a,b,c FROM( select a,b,c, case when a=1 then 5 when a=2 then 6 end as d from some_table ) AS t where d=6


Otra opción es implementar su declaración de case como una función. Especialmente bueno para problemas de conversión o cálculo. Lo bueno de las funciones es que la lógica de ''negocios'' está en un solo lugar y puede reutilizarse fácilmente en otras consultas.

-- sample code not tested CREATE FUNCTION dbo.fn_MyConvertA( -- Add the parameters for the function here @a int ) RETURNS int -- for example AS BEGIN -- Declare the return variable here DECLARE @ResultVar as int -- Add the T-SQL statements to compute the return value here set @ResultVar = case when @a = 1 then 5 when @a = 2 then 6 else 10 end -- Return the result of the function RETURN @ResultVar END GO -- now you case write your query select a,b,c, dbo.fn_MyConvertA(a) as d from some_table where dbo.fn_MyConvertA(a)=6


Un método alternativo a esto es usar CROSS APPLY :

select a,b,c, from some_table CROSS APPLY (SELECT case when a=1 then 5 when a=2 then 6 end) CxA(d) where d=6


Voy a estar de acuerdo con AlexKuznetsov en este caso, pero también agregaría que si su consulta es (no importa cuánto más compleja) la limitación en los casos de la cláusula WHERE que existen en el CASE , entonces esos CASE s nunca serán devueltos y no debería ser seleccionado en primer lugar.

Por ejemplo, está configurando d a ''6'' donde a es ''2'', luego limitando a WHERE d = 6 , por lo que podría hacer:

SELECT a,b,c, 6 AS d FROM some_table WHERE a = 2

Esto devolverá los mismos resultados de una manera más optimizada y limpia. Esta es la razón por la cual, en mi humilde opinión, no tiene sentido que pueda hacer referencia a una columna derivada.