简化此代码

时间:2010-09-30 14:39:32

标签: sql sql-server sql-server-2005 tsql

我讨厌看起来像被黑客攻击的代码。我刚刚写了这个:

update table1.dbo.totals
    set @FEE = case
       when isnull(g.SGROUPS,0) > 1
         then @GROUPPRICE * case
             when CHARINDEX('JMCG', g.GROUPS) > 0
                 then (g.SGROUPS - 2)
                 else (g.SGROUPS - 1)
                 end
             else      0
          end   
from @GROUPMEM as g

if @FEE < 0
begin
    set @GROUPFEE = 0
end

我特别想摆脱那个嵌套的CASE。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

好的,这有点奇怪,但可能很酷。它摆脱了你的嵌套案例并使用了一些bitwise operations ...

update table1.dbo.totals
    set @FEE = COALESCE((g.SGROUPS^1)&1,0) * @GROUPPRICE * 
          case
             when CHARINDEX('JMCG', g.GROUPS) > 0 then (g.SGROUPS - 2)
             else (g.SGROUPS - 1)
          end
from @GROUPMEM as g

if @FEE < 0
begin
    set @GROUPFEE = 0
end

你可能会问(g.SGROUPS^1)&1做什么......如果它有一个值,这基本上可以将g.SGROUPS转换成一个,允许我们在乘法中使用它。

答案 1 :(得分:1)

好的,我打算在这里玩一些数学游戏并利用y *(x-1)-y = y *(x-2)的事实。

编辑:已实现我的(SGROUPS-1)与(SGROUPS-2)逻辑向后并固定。

update table1.dbo.totals
    set @FEE = @GROUPPRICE * isnull(g.SGROUPS-1,0) - case when isnull(CHARINDEX('JMCG', g.GROUPS),0)>0 then g.SGROUPS else 0 end
from @GROUPMEM as g

if @FEE < 0
begin
    set @GROUPFEE = 0
end

答案 2 :(得分:1)

根本没有CASE声明,请尝试:

update table1.dbo.totals
set @FEE = @GROUPPRICE * isnull(nullif(sign(g.SGROUPS-1),-1),0)
               * (isnull(g.SGROUPS,0) - 1 - sign(CHARINDEX('JMCG', g.GROUPS))
from @GROUPMEM as g

if @FEE < 0
begin
    set @GROUPFEE = 0
end