2010-07-30 73 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