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

时间:2017-07-07 17:26:46

标签: sql sql-server case alter-table

我正在尝试将一个名为Multiplier的新列添加到名为Trades的现有表中。此列的行值将取决于名为Type的Trades表上的另一列。如果类型不是" Equity"," Corp"或者"选项,然后需要从名为ContractSize的另一个表中查找该值。最后,我希望乘数列的数据类型为十进制(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)
)

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

第15行,第1行,第2行 关键字' AS'附近的语法不正确 Msg 102,Level 15,State 1,Line 12 “#”;'附近的语法不正确。

非常感谢一些指导。

3 个答案:

答案 0 :(得分:3)

分两步完成:

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;

甚至只需将其添加为计算列。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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;