Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:根据大小写表达式添加一个新列,并从另一个表中查找值_Sql_Sql Server_Case_Alter Table - Fatal编程技术网

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

SQL:根据大小写表达式添加一个新列,并从另一个表中查找值,sql,sql-server,case,alter-table,Sql,Sql Server,Case,Alter Table,我试图将一个名为乘数的新列添加到名为Trades的现有表中。此列的行值将取决于Trades表中名为Type的另一列。如果类型不是Equity、Corp或Option,则需要从另一个名为ContractSize的表中查找该值。最后,我希望乘数列的数据类型为decimal 7,3。我的密码是: ALTER TABLE Portfolio.Trades ADD Multiplier decimal(7,3) AS ( CASE WHEN Type = 'Equity' Then 1 WHEN T

我试图将一个名为乘数的新列添加到名为Trades的现有表中。此列的行值将取决于Trades表中名为Type的另一列。如果类型不是Equity、Corp或Option,则需要从另一个名为ContractSize的表中查找该值。最后,我希望乘数列的数据类型为decimal 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)
)
我在这段代码中遇到两个错误:

Msg 156,第15级,状态1,第2行 关键字“AS”附近的语法不正确。 Msg 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;
我猜想开/关条件是不正确的。如果正确,您可以执行以下操作:

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;
甚至只需将其添加为计算列。

分两步执行:

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;
我猜想开/关条件是不正确的。如果正确,您可以执行以下操作:

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
)

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

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

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;

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

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;

您是否试图在表中创建一个“计算”列?或者只是在创建列后尝试设置现有数据的初始值?是否尝试将其创建为表中的“计算”列?或者只是在创建列后尝试设置现有数据的初始值?是的,应该是“基于相关性”。T.Identifier=CS.Identifier.谢谢,这个方法很有效,但很奇怪,只有在我去掉别名T并改为这样做之后:更新Portfolio.Trades设置乘数=CASE当Type='Equity'时,然后当Type='Corp'时为1,当Type='Option'时为0.1,然后从Portfolio.ContractSize CS WHERE Portfolio.Trades.Identifier=CS.Identifier END@MilesToGoBeforeISleep中选择ContractSize,因为别名为UPDATE Portfolio.Trades FROM Portfolio.Trades T…@MilesToGoBeforeISleep的更新的sql server语法为UPDATE Portfolio.Trades FROM Portfolio.Trades T…@MilesToGoBeforeISleep。原始语法适用于大多数数据库。SQL Server的语法略有不同。因为没有数据库标记,所以我只使用了更通用的语法。旧记录现在显示了我想要的乘数值,但是如何更新新记录?乘数显示新记录的空值。如果我重新运行上面的代码,它会工作,但是它会再次遍历所有60000行,而不是添加的10行。是的,应该是相关的。T.Identifier=CS.Identifier.谢谢,这个方法很有效,但很奇怪,只有在我去掉别名T并改为这样做之后:更新Portfolio.Trades设置乘数=CASE当Type='Equity'时,然后当Type='Corp'时为1,当Type='Option'时为0.1,然后从Portfolio.ContractSize CS WHERE Portfolio.Trades.Identifier=CS.Identifier END@MilesToGoBeforeISleep中选择ContractSize,因为别名为UPDATE Portfolio.Trades FROM Portfolio.Trades T…@MilesToGoBeforeISleep的更新的sql server语法为UPDATE Portfolio.Trades FROM Portfolio.Trades T…@MilesToGoBeforeISleep。原始语法适用于大多数数据库。SQL Server的语法略有不同。因为没有数据库标记,所以我只使用了更通用的语法。旧记录现在显示了我想要的乘数值,但是如何更新新记录?乘数显示新记录的空值。如果我重新运行上面的代码,它将工作,但它将再次遍历所有60000行,而不是添加的10行。