2010-07-30 77 views
0

我有很複雜這樣的語句:SQL情況/ 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 

我想簡化成這樣的事情這一點,是有可能:

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

請使用代碼標記... – JNK 2010-07-30 19:25:51

+1

這不是一個答案,你問的問題,但考慮使用IN語句:'情況下x.optA IN(「AB」,「FG」,'LM 」,‘QR’)' – 2010-07-30 19:27:45

+0

@Matthew瓊斯 - 不會空值打破,不過,它運行慢掃描我想太多。 EXISTS可能會更快。 – JNK 2010-07-30 19:30:02

回答

4

試試這個:

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 
    ) 

在標準SQL中,每列限制爲一個條件。

+0

其實我的計算「X.ColB /分母爲X.colB」更復雜,嵌套的情況下,也有在的情況下,一個減法,比我已經如上圖所示。 – 2010-07-30 19:44:00

+0

@Needs你能告訴你的實際查詢,然後使我們不回答無關您的需要浪費時間? – 2010-07-30 19:56:26

+0

@需要幫助:馬丁的回答如下所示,可以調整此方法。 – Frank 2010-07-30 20:46:16

0

您的評論說,您的實際需求是來自於你的問題給出不同的。

另外一個方法可能有助於可讀性/可維護性是推動複雜的條件語句轉換成一個CTE,那麼你可以檢查在主查詢一個簡單的條件,而不是重複複雜的一個。

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

我更喜歡這種方法。 – 2010-07-30 20:18:50