SQL Server 2012 Case语句无法更新我需要更新的内容

时间:2014-12-08 15:05:15

标签: sql sql-server

我正在试图弄清楚如何使这个公式适用于我的SQL Server 2012,它让我完全陷入困境。在我尝试设置case列的第一个Dateupdated语句中,在中间行,我将其作为

WHEN standardunitcost > (averageunitcost + 2.000000) THEN GETDATE()

我需要在其中添加额外的内容,以确保(Averageunitcost + 2.000000)大于22.当我尝试将其设置为((Averageunitcost + 2.000000) > 22.000000)时,它是不兼容的。

有人可以向我解释为什么我不能按照我目前的方式去做,以及如何正常工作?此外,我很抱歉,如果这是在错误的地方,或之前被问过,但我不确定要搜索什么来解决这个问题!

UPDATE [mas_wgd].[dbo].[CI_Item]
SET dateupdated = CASE
                     WHEN StandardUnitCost < AverageUnitCost THEN GETDATE()
                     WHEN standardunitcost > (AverageUnitCost + 2.000000) THEN GETDATE()
                     WHEN StandardUnitCost < 22.000000 THEN GETDATE()
                     ELSE dateupdated
                  END
WHERE ProductLine IN ('A010', 'A020', 'A030', 'A040', 'A050', 'A060', 'A070', 'A080', 'A090', 'A100', 'A110', 'A120', 'A130', 'A130', 'A140', 'A150', 'A200', 'A250', 'A300', 'A350', 'A400', 'A450', 'A500', 'A550', 'A600', 'AGNC', 'C010', 'C020', 'C030', 'C040', 'C050', 'C060', 'C070', 'C080', 'C090', 'C100', 'C110', 'C120', 'C130', 'C130', 'C140', 'C150', 'C200', 'C250', 'C300', 'C350', 'C400', 'C450', 'C500', 'C550', 'C600', 'CGNC')

UPDATE [mas_wgd].[dbo].[CI_Item]
SET Standardunitcost = CASE
                          WHEN (AverageUnitCost between 0.010000 and 22.000000) THEN 22.00000
                          WHEN AverageUnitCost > 22.000000 THEN AverageUnitCost + 2.000000
                          ELSE StandardUnitCost 
                        END
WHERE ProductLine IN ('A010', 'A020', 'A030', 'A040', 'A050', 'A060', 'A070', 'A080', 'A090', 'A100', 'A110', 'A120', 'A130', 'A130', 'A140', 'A150', 'A200', 'A250', 'A300', 'A350', 'A400', 'A450', 'A500', 'A550', 'A600', 'AGNC', 'C010', 'C020', 'C030', 'C040', 'C050', 'C060', 'C070', 'C080', 'C090', 'C100', 'C110', 'C120', 'C130', 'C130', 'C140', 'C150', 'C200', 'C250', 'C300', 'C350', 'C400', 'C450', 'C500', 'C550', 'C600', 'CGNC')

1 个答案:

答案 0 :(得分:1)

尚未发布无效的确切语法,但隐含为:

WHEN standardunitcost > ((Averageunitcost + 2.000000) > 22.000000) THEN GETDATE()

您不能像在许多语言中那样在SQL中进行复合比较操作。这些需要分解为与逻辑运算符AND结合的单个操作。

CASE
  WHEN StandardUnitCost < AverageUnitCost THEN GETDATE()
  WHEN (AverageUnitCost + 2.0) > 22 
     AND  StandardUnitCost > (AverageUnitCost + 2.0) THEN GETDATE()
  WHEN StandardUnitCost < 22.0 THEN GETDATE()
  ELSE DateUpdated
END

但是什么时候[StandardUnitCost] = 22.0?目前,如果StandardUnitCost不是&#34;&lt;&#34; AverageUnitCost(第一个条件),那么这个逻辑只检查&gt; 22.000002(或类似的东西)和&lt; 22.0。看起来这些比较中至少有一个需要是<=>=