我讨厌看起来像被黑客攻击的代码。我刚刚写了这个:
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。有什么建议吗?
答案 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)
编辑:已实现我的(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