2017-02-13 119 views
1

我想基于表中列的值更新临时表。我的CASE声明似乎不起作用。有任何想法吗?非常感谢。无法执行与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命令。

+0

它不是'CASE' *声明*,它是*表达式*。 'CASE'不能用作SQL中的控制流。 – Siyual

+0

这不起作用。 CASE语句不是IF/ELSE逻辑。 –

+1

为什么有人会低估这一点?这似乎是一个完全合法的问题,并且误解了某些事情是如何运作的。 –

回答

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 
+0

嗨乔,感谢这个解决方案,但我想我没有充分描述这个问题。我需要根据FA_rows的值为每条记录更新列NewFARate1,NewFARate2 ...等。所以这就是我想要做的,但我使用的SQL显然不工作: –

+0

@LionB只要添加一个ELSE的case语句,设置FA的东西本身,如果你不想更新它 –

+0

谢谢但问题仍未解决。请再看看这个问题。我已经更新了它。另外,ELSE是可选的,不应该影响代码,如果省略是正确的? –

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表达式来确定哪些更新列的值。如果它不在所提供的值中,它会将列的值设置为自身 - 因此不更新列。

+0

我想我没有充分描述这个问题。我需要根据FA_rows的值为每条记录更新列NewFARate1,NewFARate2 ...等。所以这就是我想要做的。如果fa-rows是2,那么我想更新NewFARate1&NewFARate2。如果fa_rows是3,那么我想更新NewFARate1,NewFARate2和NewFARate3。因此,我将始终更新NewFARate1,但N表中的每一行都为N。我希望这是明确的。 –

+0

@LionB除非我错过了一些东西,否则我的解决方案将完成此操作。 – Siyual

+0

Siyual。你是绝对正确的。这工作!我基于你的逻辑改变了我的查询,得到了这个: –