【问题标题】:SQL Conditional UPDATE Based on SELECT基于 SELECT 的 SQL 条件更新
【发布时间】:2012-02-18 20:53:24
【问题描述】:

在 SQL Server 2008 中,我有一组包含东部和西部成本的数据。我正在为加拿大的客户添加一个新字段,该字段需要是东部或西部成本的 1.5 倍(以较大者为准)。所以我试图想出一些我可以执行的sql。我尝试了以下方法但没有成功:

 UPDATE ShippingCost

 SET

    IF EastCost>WestCost

       Canada= EastCost*1.8

    ELSE

       Canada= WestCost*1.8
    ENDIF

我确定有一种简单的方法可以做到这一点?有什么想法吗?

【问题讨论】:

  • 您能否指定您正在使用的数据库平台?
  • 使用 MS SQL Server 2008
  • 您的规范说,“东方或西方成本的 1.5 倍(哪个更大)”即因子是 1.5,但您的代码使用因子 1.8。

标签: sql sql-server sql-server-2008 select sql-update


【解决方案1】:
 UPDATE ShippingCost SET Canada = GREATEST(EastCoast, WestCoast) * 1.8;

注意: T-SQL 方言不支持GREATEST

【讨论】:

  • MySQL 和 Oracle 有 GREATEST,但我想不出任何有 Max(a,b) 的方言
  • 是的,不是MAX,而是GREATEST。为错误道歉! MAX 是另一个在这种情况下不起作用的函数。
【解决方案2】:
UPDATE ShippingCost
   SET Canada = 1.5 * CASE 
                         WHEN EastCost > WestCost THEN EastCost
                         ELSE WestCost
                      END;

【讨论】:

    【解决方案3】:

    使用两个更新语句:

    UPDATE SHIPPINGCOST SET Canada = EastCost*1.8 WHERE EastCost>WestCost
    UPDATE SHIPPINGCOST SET Canada = WestCost*1.8 WHERE EastCost<=WestCost 
    

    【讨论】:

    • 性能。如果表很大,那么如果您使用 CASE 语句,那么优化器可能不够聪明,无法利用索引。此外,不确定 CASE 子句的可移植性如何。我知道某些较旧的 Oracle 版本不支持它(您必须使用 DECODE)。它现在是 ANSI 标准,但您仍然必须确保它在您正在运行的数据库版本中工作。
    【解决方案4】:

    你需要使用案例

     UPDATE ShippingCost
    
     SET
         Canada = CASE WHEN EastCost>WestCost THEN  EastCost*1.8
                       ELSE WestCost*1.8 END
    

    【讨论】:

    • 太棒了!完全按照我想要的方式工作。谢谢!
    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多