无法使用CASE语句执行UPDATE

时间:2017-02-13 21:00:36

标签: sql

我尝试根据表中列的值更新临时表。我的CASE声明似乎不起作用。有任何想法吗?非常感谢。

这是我创建临时表的地方。列包含值。

IF OBJECT_ID('tempdb..#Accounts') IS NOT NULL DROP TABLE #Accounts;
Create Table #Accounts
(
    FA_rows bigint,
    PR_rows bigint,
    NewFARate1 decimal(10,5),
    NewFARate2 decimal(10,5),
    NewFARate3 decimal(10,5),
    NewFARate4 decimal(10,5),
    NewFARate5 decimal(10,5),
    PctRate1 decimal (10,5),
    PctRate2 decimal (10,5),
    PctRate3 decimal (10,5),
    PctRate4 decimal (10,5),
...PctRate10 decimal (10,5)
)

此处尝试更新(我已添加更多详细信息):

UPDATE #Accounts

--when fa_rows is 2 I need to do this
    SET NewFARate1 = CASE FA_rows WHEN 2 THEN PctRate12 - PctRate7 END,
    NewFARate2 = CASE FA_rows WHEN 2 THEN PctRate3 - PctRate8 END,

---when fa_rows is 3 I need to do this
    SET NewFARate1 = CASE FA_rows WHEN 3 THEN PctRate12 - PctRate7 END,
    NewFARate2 = CASE FA_rows WHEN 3 THEN PctRate3 - PctRate8 END,
    NewFARate3 = CASE FA_rows WHEN 3 THEN PctRate3 - PctRate8 END

--when fa_rows is 4 I need to do this
    SET NewFARate1 = CASE WHEN 4 THEN PctRate2 - PctRate7 END,
    NewFARate2 = CASE WHEN 4 THEN PctRate3 - PctRate8 END,
    NewFARate3 = CASE WHEN 4 THEN PctRate4 - PctRate9 END,
    NewFARate4 = CASE WHEN 4 THEN PctRate5 - PctRate10 END                    
    WHERE FA_rows = PR_rows 

此代码显然无效。预处理器不喜欢多个SET命令。

2 个答案:

答案 0 :(得分:2)

将CASE视为一个返回值而不是条件的函数。

UPDATE #Accounts
SET NewFARate1 = CASE fa_rows WHEN 2 THEN PctRate2 - PctRate7 WHEN 3 THEN PctRate2 - PctRate7 END,
    NewFARate2 = CASE fa_rows WHEN 2 THEN ... etc
...
END
WHERE FA_rows = PR_rows

答案 1 :(得分:2)

CASE表达式,而不是语句。它不能用作SQL中的逻辑控件。但是,您可以使用以下内容为您提供结果:

Update  #Accounts
Set     NewFARate1 = Case 
                        When fa_rows In (2, 3)
                            Then PctRate2 - PctRate7
                        Else NewFARate1 End,
        NewFARate2 = Case
                        When fa_rows In (2, 3) 
                            Then PctRate3 - PctRate8
                        Else NewFARate2 End,
        NewFARate3 = Case
                        When fa_rows In (3) 
                            Then PctRate4 - PctRate9
                        Else NewFARate3 End
Where   FA_rows = PR_rows

上面使用单独的CASE表达式来确定要更新列值的内容。如果它不在提供的值中,它会将列的值设置为自身 - 因此,不更新列。