SQL:根据 CASE 表达式添加一个新列并从另一个表中查找值

Mil*_*eep 0 sql sql-server case alter-table

我正在尝试将一个名为 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)
)
Run Code Online (Sandbox Code Playgroud)

我在此代码上遇到两个错误:

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

非常感谢一些指导。

Gor*_*off 5

分两步执行此操作:

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;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

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