SQL: 添加一个基于 CASE 表达式的新列并从另一个 table 中查找值

SQL: Add a new column based on CASE expression and looking up values from another table

我正在尝试将一个名为 Multiplier 的新列添加到一个名为 Trades 的现有 table 中。此列的行值将取决于交易 table 上称为类型的另一列。如果类型不是 "Equity"、"Corp" 或“选项”,则需要从另一个名为 ContractSize 的 table 中查找该值。最后,我想要乘数的数据类型列为十进制 (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 行 ')' 附近的语法不正确。

非常感谢一些指导。

分两步完成:

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;

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

每个 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
)

为什么要向 table 添加列?您也可以创建一个视图。

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;