Упростите этот код - PullRequest
       1

Упростите этот код

4 голосов
/ 30 сентября 2010

Я ненавижу код, который выглядит так, как будто его взломали вместе. Я только что написал это:

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

Я особенно хочу избавиться от этого вложенного СЛУЧАЯ. Есть предложения?

Ответы [ 3 ]

3 голосов
/ 30 сентября 2010

Хорошо, так что это немного странно, но может быть круто.Он избавляется от вашего вложенного регистра и использует некоторые побитовые операции ...

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 голос
/ 30 сентября 2010

Чтобы вообще не было операторов 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
1 голос
/ 30 сентября 2010

ОК, я собираюсь сыграть здесь в некоторые математические игры и воспользоваться тем, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...