我可以在WHILE循环中使用CASE语句吗?

5
这是我正在做的事情:
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个回答

8

根据您所提出的需求,您应该使用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

1
代码示例加1分,不过需要更详细的说明SQL Server中的CASE是一个表达式,而不是根据文档中“备注”部分的决策逻辑。http://msdn.microsoft.com/en-us/library/ms181765.aspx - OMG Ponies

7
不,SQL中的CASE结构是用来返回值的,而不是用于程序流程。您需要将其分解为IF语句。

4

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

1

这里不应该使用 while 循环。实际上,你只检查了 @newBalance 的值一次。可以考虑以下方式:

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

IF @newBalance > 0
BEGIN
   @monFee2 = @monthlyFee
   @newBalance = @newBalance-@fee
END 

两个月的时间已经足够了,但当他到达12个月时会发生什么? - Amy B
然后他编写了一个递归函数。 - Tim Rooks

1

由于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

顺便说一下:祝你老龄化报告好运...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接