根据另一列#2

时间:2018-01-11 19:58:12

标签: sql sql-server sql-server-2012

拥有一个包含1000多行的表(设置)和两列(名称,值)。我需要根据名称更新一些值。

使用Updating one column based on the value of another column我得到"无效的列名称' AppName'和AppID'"。

update Test.dbo.Setting
set Value = (CASE 
               WHEN Name = AppName
                 THEN 'Test1'
               WHEN Name = AppID
                 THEN 'Test2'
               END);

为什么这会在另一个线程中起作用,但在我的示例中却不行?无论如何,我继续用单引号包装AppName和AppID。

update Test.dbo.Setting
set Value = (CASE 
               WHEN Name = 'AppName'
                 THEN 'Test1'
               WHEN Name = 'AppID'
                 THEN 'Test2'
               END);

返回"无法将值NULL插入列'值',表' Test.dbo.Config&#39 ;;列不允许空值。更新失败。"这是真的,它不允许NULL,我的想法是因为没有ELSE语句它试图将NULL写入其余的1k +值。

所以让我们试试吧..

update Test.dbo.Setting
set Value = (CASE 
               WHEN Name = 'AppName'
                 THEN 'Test1'
               WHEN Name = 'AppID'
                 THEN 'Test2'
               ELSE Value
               END);

哎呀,它有效,但也会将所有值覆盖到它们当前的状态。所以尽管它可以正常运行"除了我指定的值之外,我不想触及其他值。

除了下一步要尝试的一塌糊涂之外......关于如何优化的更好的想法?

感谢。

2 个答案:

答案 0 :(得分:1)

只需添加WHERE子句即可仅更新要更新的行:

UPDATE Test.dbo.Setting
   SET [Value] = (CASE WHEN [Name] = 'AppName'
                       THEN 'Test1'
                  WHEN [Name] = 'AppID'
                       THEN 'Test2'
                  END)
 WHERE [Name] IN ('AppName', 'AppID')

答案 1 :(得分:0)

您始终可以尝试按以仅更新所需的行而不覆盖值:

update Test.dbo.Setting
set Value = (CASE 
               WHEN Name = 'AppName'
                 THEN 'Test1'
               WHEN Name = 'AppID'
                 THEN 'Test2'
               END)
WHERE Name IN ('AppName','AppID')