2010-01-19 17 views
9

¿Hay alguna manera en TSQL a hacer algo como esto:TSQL - Utilice un derivado Seleccionar columna en la cláusula WHERE

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 de caso real es muy complejo, por lo que estoy tratando de evitar que se repita en la cláusula where? ¿Hay algún truco para hacer esto?

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

Respuesta

18
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 
+0

Gracias, Alex –

2

Haga su consulta publicado un sub-consulta y seleccione de ella donde d = 6. Por lo que yo sé no hay manera de hacer referencia a una columna derivada en la misma consulta.

4

Este es un buen lugar para utilizar CTEs, 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 
+0

gustaría que esto se upvoted más ya que es mucho menos ruidoso que la respuesta aceptada (spasibo!). – MushinNoShin

2

voy a estar de acuerdo con AlexKuznetsov en este caso, pero también me gustaría añadir que si la consulta es (no importa cuánto más complejo) limitando en los casos de la cláusula WHERE que existen en el CASE, entonces esos CASE s nunca serán devueltos y no deberían seleccionarse en primer lugar.

Por ejemplo, se está configurando d a '6', donde a es '2', a continuación, la limitación a WHERE d = 6, por lo que en su lugar podría hacer:

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

Esto devolverá los mismos resultados de una forma más moda 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.

1

Otra opción es implementar su declaración 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 
0

Un método alternativo para esto es utilizar 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 
Cuestiones relacionadas