2010-01-19 7 views
9

Y at-il une façon TSQL de faire quelque chose comme ceci:TSQL - Utiliser une Select colonne dérivée dans la clause 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 déclaration réelle de cas est vraiment complexe, donc je suis en train d'éviter de le répéter dans la clause where? Y a-t-il des astuces pour le faire?

(Je pense qu'il y a un truc dans MySQL pour utiliser "avoir d = 6").

Répondre

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

Merci, Alex –

2

Faites votre requête posté un sous-requête et sélectionnez là où d = 6. Pour autant que je sais qu'il n'y a aucun moyen de référencer une colonne dérivée dans la même requête.

4

Ceci est un bon endroit pour utiliser CTEs, par exemple:

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

souhaite que ce fut upvoted plus car il est beaucoup moins bruyant que la réponse acceptée (spasibo!). – MushinNoShin

2

Je vais être d'accord avec AlexKuznetsov sur celui-ci, mais je voudrais aussi ajouter que si votre requête est (peu importe combien plus complexe) limitant dans les cas de clause WHERE qui existent dans le CASE, alors ceux CASE ne seront jamais retournés et ne devraient pas être sélectionnés en premier lieu.

Par exemple, vous configurez d à « 6 » où a est « 2 », ce qui limite alors à WHERE d = 6, pour que vous puissiez faire à la place:

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

Cela les mêmes résultats dans un plus mode optimisée et propre. C'est pourquoi, à mon humble avis, il ne sert à rien de pouvoir référencer une colonne dérivée.

1

Une autre option consiste à implémenter votre instruction case en tant que fonction. Particulièrement bon pour les problèmes de conversion ou de calcul. Ce qui est bien dans les fonctions, c'est que la logique 'business' est au même endroit et peut facilement être réutilisée dans d'autres requêtes.

-- 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

Une méthode alternative à cela est d'utiliser 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 
Questions connexes