Y a-t-il un moyen de faire quelque chose comme ceci: 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? P> (Je pense qu'il y a une truc dans MySQL d'utiliser "avoir d = 6"). P> p>
6 Réponses :
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
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. P>
Ceci est un bon endroit pour utiliser CTES , par exemple: < Pré> xxx pré> p>
J'aimerais que cela ait été avisé plus car il est beaucoup moins bruyant que la réponse acceptée.
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 Par exemple, vous définissez 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.
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
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
Une méthode alternative à ceci est d'utiliser cross applicatif code>: