12
votes

TSQL - Utilisez une colonne de sélection dérivée dans la clause WHERE

Y a-t-il un moyen de faire quelque chose comme ceci: XXX

L'instruction CASE est vraiment complexe, alors j'essaie d'éviter de le répéter dans la clause WHERE? Y a-t-il des astuces pour faire cela?

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


0 commentaires

6 Réponses :


22
votes
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 commentaires

2
votes

Faites de votre requête postée une sous-requête et choisissez-la dans laquelle D = 6. Autant que je sache, il n'y a aucun moyen de faire référence à une colonne dérivée dans la même requête.


0 commentaires

7
votes

Ceci est un bon endroit pour utiliser CTES , par exemple: < Pré> xxx


1 commentaires

J'aimerais que cela ait été avisé plus car il est beaucoup moins bruyant que la réponse acceptée.



2
votes

Je vais d'accord avec Alexkuznetsov sur celui-ci, mais j'ajouterais également que si votre requête est (quelle que soit la quantité plus complexe) limitant dans le où code> cas de clause existant dans le cas code>, alors ces cas code> S ne seront jamais retournés et ne doivent pas être sélectionnés en premier lieu.

Par exemple, vous définissez d code> à '6' Où A code> est '2', puis limitant à où d = 6 code>, afin que vous puissiez plutôt faire: p>

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


0 commentaires

3
votes

Une autre option consiste à implémenter votre énoncé code> case code> en fonction de la fonction. Particulièrement bon pour les problèmes de conversion ou de calcul. Ce qui est beau sur les fonctions, c'est que la logique «entreprise» 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 commentaires

0
votes

Une méthode alternative à ceci est d'utiliser cross applicatif : xxx


0 commentaires