Могу ли я иметь оператор CASE в цикле WHILE? - PullRequest
4 голосов
/ 26 мая 2010

Вот что я делаю:

while (@counter < 3 and @newBalance >0)
begin   
CASE
when  @counter = 1 then  ( @monFee1 = @monthlyFee, @newBalance = @newBalance-@fee)
when  @counter = 2 then  ( @monFee2 = @monthlyFee, @newBalance = @newBalance-@fee)
END
@counter = @counter +1
end

Я получаю эту ошибку:

Неверный синтаксис рядом с ключевым словом "CASE".

Понятия не имею, почему. Пожалуйста, помогите!

Ответы [ 5 ]

7 голосов
/ 26 мая 2010

Для того, что вы предлагаете, вы должны использовать оператор IF

While (@counter < 3 and @newBalance >0)
Begin
    If @Counter = 1 Then
        Begin
            Set @monFee1 = @monthlyFee
            Set @newBalance = @newBalance-@fee
        End

    If @Counter = 2 Then
        Begin
            Set @monFee2 = @monthlyFee
            Set @newBalance = @newBalance-@fee
        End

    Set @counter = @counter +1 
End
6 голосов
/ 26 мая 2010

Нет, структура CASE в SQL должна возвращать значение, а не для потока программы. Вам нужно разбить его на операторы IF.

3 голосов
/ 26 мая 2010

Оператор CASE не используется для логики ветвления так же, как его двоюродный брат в процедурном коде. Он вернет результат в наборе результатов, так что когда вы присваиваете значение переменной, вы можете определить, каким будет значение, а не какой переменной вы назначаете.

К сожалению,

(@monFee1 = @counter, @newBalance = @newBalance-@fee)

не возвращает значение.

Альтернативный подход с использованием логики расчленения If / Else будет

while (@counter < 3 and @newBalance >0)
begin   
    IF @counter = 1
    THEN
        SET @monFee1 = @monthlyFee
        SET @newBalance = @newBalance-@fee
    END
    ELSE IF @counter = 2
    BEGIN
        SET @monFee2 = @monthlyFee
        SET @newBalance = @newBalance-@fee
    END
        SET @counter = @counter +1
end
0 голосов
/ 27 мая 2010

Поскольку CASE является выражением, вы можете использовать его в операторе присваивания SET.

WHILE (@counter < 3 and @newBalance >0) 
BEGIN
  SET @monFee1 = CASE WHEN @Counter=1
    THEN @monthlyFee ELSE @monFee1 END
  SET @monFee2 = CASE WHEN @Counter=2
    THEN @monthlyFee ELSE @monFee2 END
  SET @newBalance = @newBalance - CASE WHEN @Counter in (1, 2)
    THEN @fee ELSE 0 END
  SET @counter = @counter +1 
END

Может также использоваться в операторе присваивания SELECT.

WHILE (@counter < 3 and @newBalance >0) 
BEGIN
  SELECT
    @monFee1 = CASE WHEN @Counter=1
      THEN @monthlyFee ELSE @monFee1 END,
    @monFee2 = CASE WHEN @Counter=2
      THEN @monthlyFee ELSE @monFee2 END,
    @newBalance = @newBalance - CASE WHEN @Counter in (1, 2)
      THEN @fee ELSE 0 END,
    @counter = @counter +1 
END

PS: удачи в отчете о старении ...

0 голосов
/ 26 мая 2010

Вы не должны использовать цикл while здесь. Вы фактически проверяете значение @newBalance только один раз. Рассмотрим:

@monFee1 = @monthlyFee
@newBalance = @newBalance-@fee

IF @newBalance > 0
BEGIN
   @monFee2 = @monthlyFee
   @newBalance = @newBalance-@fee
END 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...