【问题标题】:SQL: Add a new column based on CASE expression and looking up values from another tableSQL:根据 CASE 表达式添加新列并从另一个表中查找值
【发布时间】:2017-07-08 06:54:41
【问题描述】:

我正在尝试将名为 Multiplier 的新列添加到名为 Trades 的现有表中。此列的行值将取决于 Trades 表中名为 Type 的另一列。如果 Type 不是“Equity”、“Corp”或“Option”,则需要从另一个名为 ContractSize 的表中查找该值。最后,我希望 Multiplier 列的数据类型为十进制(7,3 ). 我的代码是:

ALTER TABLE Portfolio.Trades
ADD Multiplier decimal(7,3) AS
(
CASE 
 WHEN Type = 'Equity' Then 1
 WHEN Type = 'Corp' Then 0.1
 WHEN Type = 'Option' Then 100
ELSE
 (SELECT ContractSize FROM Portfolio.ContractSize CS
 JOIN Portfolio.Trades T
 ON T.Identifier = CS.ContractSize)
)

我在这段代码中遇到两个错误:

消息 156,级别 15,状态 1,行 2 关键字“AS”附近的语法不正确。
消息 102,第 15 级,状态 1,第 12 行 ')' 附近的语法不正确。

非常感谢一些指导。

【问题讨论】:

  • 您是否尝试将其创建为表格中的“计算”列?还是只是在创建列后尝试为现有数据设置初始值?

标签: sql sql-server case alter-table


【解决方案1】:

分两步进行:

ALTER TABLE Portfolio.Trades ADD Multiplier decimal(7,3);

UPDATE T
    SET Multiplier = (CASE WHEN T.Type = 'Equity' Then 1
                           WHEN T.Type = 'Corp' Then 0.1
                           WHEN T.Type = 'Option' Then 100
                           ELSE (SELECT CS.ContractSize
                                 FROM Portfolio.ContractSize CS
                                 WHERE T.Identifier = CS.ContractSize)
                       END)
    FROM Portfolio.Trades T;

我猜ON/相关条件不正确。如果它是正确的,你可以这样做:

UPDATE T
    SET Multiplier = (CASE WHEN T.Type = 'Equity' Then 1
                           WHEN T.Type = 'Corp' Then 0.1
                           WHEN T.Type = 'Option' Then 100
                           ELSE T.Identifier)
                       END)
    FROM Portfolio.Trades T;

或者甚至只是将其添加为计算列。

【讨论】:

  • 是的,应该是 ON 相关性。 T.Identifier = CS.Identifier.
  • 谢谢,这可行,但奇怪的是,只有在我取出别名 T 并改为这样做之后: UPDATE Portfolio.Trades SET Multiplier = ( CASE WHEN Type = 'Equity' Then 1 WHEN Type = 'Corp ' Then 0.1 WHEN Type = 'Option' Then 100 ELSE (SELECT ContractSize FROM Portfolio.ContractSize CS WHERE Portfolio.Trades.Identifier = CS.Identifier) END )
  • @MilesToGoBeforeISleep 因为带有别名的 UPDATE 的 sql-server 语法是 UPDATE Portfolio.Trades FROM Portfolio.Trades T ...
  • @MilesToGoBeforeISleep 。 . .原始语法适用于大多数数据库。 SQL Server 的语法略有不同。因为没有数据库标签,所以我只是使用了更通用的语法。
  • 旧记录现在显示我想要的乘数值,但如何更新新记录? Multiplier 显示新记录的 NULL 值。如果我重新运行上面的代码,它会工作,但它会再次遍历所有 60,000 行,而不是添加的 10 个新行。
【解决方案2】:

为什么要在表格中添加列?您也可以创建视图。

CREATE VIEW myView AS
    SELECT *, -- your real column list here
        CAST(CASE
         WHEN Type = 'Equity' Then 1
         WHEN Type = 'Corp' Then 0.1
         WHEN Type = 'Option' Then 100
         ELSE
           (SELECT ContractSize 
            FROM Portfolio.ContractSize CS
            WHERE T.Identifier = CS.ContractSize)
         END AS decimal(7,3)) AS  Multiplier
    FROM
    Portfolio.Trades T;

【讨论】:

    【解决方案3】:

    每个 CASE 语句都必须在条件末尾有一个 END 关键字。在这种情况下应该是这样的。

    ALTER TABLE Portfolio.Trades
    ADD Multiplier decimal(7,3) AS
    (
    CASE 
     WHEN Type = 'Equity' Then 1
     WHEN Type = 'Corp' Then 0.1
     WHEN Type = 'Option' Then 100
    ELSE
     (SELECT ContractSize FROM Portfolio.ContractSize CS
     JOIN Portfolio.Trades T
     ON T.Identifier = CS.ContractSize)END
    )
    

    【讨论】:

      猜你喜欢
      • 2020-08-06
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 2021-05-22
      • 2020-07-29
      相关资源
      最近更新 更多