2010-07-30 7 views
0

J'ai une déclaration qui est compliquée comme ceci:cas sql/instruction if

select x.ColA as ColA 

, case when x.optA = 'AB' or x.optA = 'FG' or x.optA = 'LM' or x.optA = 'QR' then X.ColB/100 else X.ColB/900 End as ColB 
, case when x.optA = 'AB' or x.optA = 'FG' or x.optA = 'LM' or x.optA = 'QR' then X.ColC/100 else X.ColC/900 End as ColC 
, case when x.optA = 'AB' or x.optA = 'FG' or x.optA = 'LM' or x.optA = 'QR' then X.ColD/100 else X.ColD/900 End as ColD 
, case when x.optA = 'AB' or x.optA = 'FG' or x.optA = 'LM' or x.optA = 'QR' then X.ColE/100 else X.ColE/900 End as ColE 

From TableA 

Je veux simplifier cela en quelque chose comme ça, est-il possible:

select x.ColA as ColA 

case when x.optA = 'AB' or x.optA = 'FG' or x.optA = 'LM' or x.optA = 'QR' then 

, X.ColB/100 as ColB 
, X.ColC/100 as ColC 
, X.ColD/100 as ColD 
, X.ColE/100 as ColE 

Else 

, X.ColB/900 as ColB 
, X.ColC/900 as ColC 
, X.ColD/900 as ColD 
, X.ColE/900 as ColE 

End 

From TableA 
+0

S'il vous plaît utiliser les balises de code ... – JNK

+1

Ce n'est pas une réponse à la question que vous avez posée, mais pensez à utiliser l'instruction IN: 'cas où x.optA IN ('AB', 'FG', 'LM ',' QR ') ' –

+0

@Matthew Jones - Nulls ne cassera pas cela, cependant, et il fonctionne un scan lent, je pense aussi. EXISTS peut être plus rapide. – JNK

Répondre

4

Essayez ceci:

select x.ColA, 
     X.ColB/denominator as colB, 
     X.ColC/denominator as colC, 
     X.ColD/denominator as colD, 
     X.ColE/denominator as colE 
from (
    select x.ColA, X.ColB, X.ColC, X.ColD, X.ColE, 
      case when x.optA = 'AB' or x.optA = 'FG' or x.optA = 'LM' or x.optA = 'QR' then 100 else 900 End as denominator 
    From TableA 
    ) 

En SQL standard, vous êtes limité à une condition par colonne.

+0

En fait mon calcul "X.ColB/dénominateur comme X.colB" est plus compliqué, avec un cas imbriqué, qui a aussi une soustraction dans l'un des cas, que ce que j'ai montré plus haut. –

+0

@Needs Pouvez-vous montrer votre requête actuelle alors nous ne perdons pas de temps sur les réponses non pertinentes à vos besoins? –

+0

@Needs Aide: Cette approche peut être adaptée, comme le montre la réponse de Martin ci-dessous. – Frank

0

Vous dites dans un commentaire que vos besoins réels sont différents de ceux présentés dans votre question. Une autre approche qui pourrait aider la lisibilité/maintenabilité est de pousser l'instruction de condition compliquée dans un CTE, alors vous pouvez vérifier une condition plus simple dans la requête principale plutôt que de répéter la condition complexe.

WITH cte AS 
(
select case when x.optA = 'AB' or x.optA = 'FG' or x.optA = 'LM' or x.optA = 'QR' then 1 else 0 end as cond, 
ColB, 
ColC, 
ColD, 
ColE 
FROM x 
) 

select x.ColA as ColA , 
case when cond=1 then X.ColB/100 else X.ColB/900 As ColB 
case when cond=1 then X.ColC/100 else X.ColC/900 As ColC 
case when cond=1 then X.ColD/100 else X.ColD/900 As ColD 
case when cond=1 then X.ColE/100 else X.ColE/900 As ColE 
From cte 
+0

J'aime mieux cette approche. –