Sql server 2005 sql case/if语句

Sql server 2005 sql case/if语句,sql-server-2005,case,Sql Server 2005,Case,我有一个很复杂的陈述: 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

我有一个很复杂的陈述:

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  
试试这个:

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中,每列只能有一个条件。

请尝试以下操作:

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中,每列只能有一个条件。

您在评论中说,您的实际需要与问题中提出的不同

另一种可能有助于可读性/可维护性的方法是将复杂的条件语句推送到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  

你在评论中说,你的实际需求与问题中提出的不同

另一种可能有助于可读性/可维护性的方法是将复杂的条件语句推送到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  

这不是你提出的问题的答案,而是考虑使用In语句:<代码>当X.OpTa(“AB”、“FG”、“LM”、“QR”)< /代码> @ Matthew Jones时,NULL不会打破它,而且我也会进行慢扫描。存在可能会更快。这不是你提出的问题的答案,而是考虑使用In语句:<代码>当X.OpTa(“AB”、“FG”、“LM”、“QR”)< /代码> @ Matthew Jones时,NULL不会破坏它,而且我也会进行慢扫描。EXISTS可能会更快。实际上,我的计算“X.ColB/分母为X.ColB”比我上面显示的更复杂,有一个嵌套的大小写,其中一个大小写中也有减法。@需要您可以显示您的实际查询,这样我们就不会在与您的需要无关的答案上浪费时间吗?@需要帮助:这种方法可以调整,正如Martin下面的回答所示,实际上我的计算“X.ColB/分母为X.ColB”更复杂,有一个嵌套的情况,其中一个情况下也有减法,比我上面显示的要多。@Needs那么你能显示你的实际查询吗?这样我们就不会在与你的需求无关的答案上浪费时间了?@Needs-Help:这种方法可以调整,正如马丁下面的回答所示。