2017-01-18 120 views
0

以下SQL代码位于where子句中。有没有其他的方法可以写出来缩短这一点。下面的代码重复了很多次。我想缩短此代码减少SQL代码

((Business_Unit = 'A' 
and ((
convert(money, case when substring(ltrim(rtrim(premium_change)),len(ltrim(rtrim(premium_change))),1) = '-' 
then substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change))) -1) else 
substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change)))) end) 
) >= 100)) 
OR 


(Business_Unit = 'B' 
AND ((
convert(money, case when substring(ltrim(rtrim(premium_change)),len(ltrim(rtrim(premium_change))),1) = '-' 
then substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change))) -1) else 
substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change)))) end) 
) >=100.00) 
AND (text7 != 'N') 
OR 

Business_Unit = 'B' 
AND ((
convert(money, case when substring(ltrim(rtrim(premium_change)),len(ltrim(rtrim(premium_change))),1) = '-' 
then substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change))) -1) else 
substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change)))) end) 
) >=100.00) 
AND (text7 = 'N') 
and (text4 != '') 
OR Business_Unit = 'B' 
AND ((
convert(money, case when substring(ltrim(rtrim(premium_change)),len(ltrim(rtrim(premium_change))),1) = '-' 
then substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change))) -1) else 
substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change)))) end) 
) > 300.00) 
AND (text7 = 'N') 
and (text4 = '')) 
OR 
(Business_Unit = 'C' 
and ((
convert(money, case when substring(ltrim(rtrim(premium_change)),len(ltrim(rtrim(premium_change))),1) = '-' 
then substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change))) -1) else 
substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change)))) end) 
) >= 150)`enter code here` 
and text1 != 'N') 
+0

也许东西它变成一个功能?虽然当你将货币值存储在一个字符串中时,会出现一些错误。为什么不首先使用金钱数据类型? – Martheen

+0

它工作正常。当我执行时没有错误,但我只是想用可重复的代码做些事情。 – user7432916

+0

如果你检查下面的代码,它重复一次又一次。我想避免这种情况,转换(货币,当子字符串的情况下(ltrim(rtrim(premium_change)),len(ltrim(rtrim(premium_change))),1)=' - ' then substring(ltrim(rtrim(premium_change)) ,1,len(ltrim(rtrim(premium_change)))-1)else 子串(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change)))end) )> = 100)) – user7432916

回答

2

我会在这里使用CTE。我们的想法是为您的where子句准备数据:

;with cte as 
(--your current query here without where clasuse 
--just add the following to the select list 
convert(money, case when substring(ltrim(rtrim(premium_change)), 
            len(ltrim(rtrim(premium_change))), 
            1) = '-' 
        then substring(ltrim(rtrim(premium_change)), 1, 
            len(ltrim(rtrim(premium_change))) 
            - 1) 
        else substring(ltrim(rtrim(premium_change)), 1, 
            len(ltrim(rtrim(premium_change)))) 
       end) as pc 
) 
select * from cte 
where 
    (Business_Unit = 'A' and pc >= 100) or 
    (Business_Unit = 'B' and pc >= 100 and text7 != 'N') or 
    ... 

我无法解析您的怪异AND OR组合(这似乎不正确反正)。

如果使用CTE是不可能的,你可以缩短如下:

substring(ltrim(rtrim(premium_change)),len(ltrim(rtrim(premium_change))),1) 

变为:

right(ltrim(rtrim(premium_change)), 1) 

和:

substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change))) -1) 

变为:

left(ltrim(rtrim(premium_change)), len(ltrim(rtrim(premium_change))) -1) 

和:

substring(ltrim(rtrim(premium_change)),1,len(ltrim(rtrim(premium_change)))) 

变为:

ltrim(rtrim(premium_change)) 
+0

它听起来像它会工作..谢谢你Nakeuri ..任何更多的想法.. – user7432916

+0

是否有可能在where子句 – user7432916

+0

之后定义CTE,但是select语句对于它有很多case语句是非常大的。此外,select查询是select语句的子查询,, – user7432916