T-SQL:在 UPDATE 语句中使用 CASE 根据条件更新某些列

Posted

技术标签:

【中文标题】T-SQL:在 UPDATE 语句中使用 CASE 根据条件更新某些列【英文标题】:T-SQL: Using a CASE in an UPDATE statement to update certain columns depending on a condition 【发布时间】:2011-06-17 08:13:02 【问题描述】:

我想知道这是否可能。如果条件为真,我想更新列 x,否则将更新列 y

UPDATE table SET
     (CASE (CONDITION) WHEN TRUE THEN columnx
                       ELSE columny
      END)
= 25

我已经到处搜索,尝试了一些东西,但无法找到解决方案。我认为这是不可能的,但我想我会在这里问一下,看看是否有人以前做过。提前致谢。

【问题讨论】:

假设都在同一个表中,是的。您可以随时在事务中运行它,并在错误时回滚,以亲自查看。 我不确定你的意思。我尝试为该列设置条件,但它不起作用。它适用于 select 语句,但不适用于更新语句。(select(case(条件)当 true 然后 columnx else columny end)来自 myTable ......更新不起作用,我可以看到原因。没有似乎没有办法做到这一点。 【参考方案1】:

我相信您可以通过调整其他答案来省略更新“不想要的”列,如下所示:

update table set
    columnx = (case when condition1 then 25 end),
    columny = (case when condition2 then 25 end)`

据我了解,只有在满足条件时才会更新。

看完所有的cmets,这个效率最高:

Update table set ColumnX = 25 where Condition1
 Update table set ColumnY = 25 where Condition1`

示例表

CREATE TABLE [dbo].[tblTest](
    [ColX] [int] NULL,
    [ColY] [int] NULL,
    [ColConditional] [bit] NULL,
    [id] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]

样本数据

Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0)
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0)
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1)
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1)
Insert into tblTest (ColX, ColY, ColConditional) values (1, null, null)
Insert into tblTest (ColX, ColY, ColConditional) values (2, null, null)
Insert into tblTest (ColX, ColY, ColConditional) values (null, 1, null)
Insert into tblTest (ColX, ColY, ColConditional) values (null, 2, null)

现在我假设您可以编写一个处理空值的条件。对于我的示例,我假设您已经编写了这样一个计算结果为 True、False 或 Null 的条件。如果您需要这方面的帮助,请告诉我,我会尽力而为。

现在运行这两行代码实际上将 X 更改为 25 当且仅当 ColConditional 为 True(1) 并且 Y 更改为 25 当且仅当 ColConditional 为 False(0)

Update tblTest set ColX = 25 where ColConditional = 1
Update tblTest set ColY = 25 where ColConditional = 0

附:原始问题或问题的任何更新中从未提及 null 案例,但正如您所见,这个非常简单的答案无论如何都可以处理它们。

【讨论】:

这实际上是行不通的。其一,如果该列允许空值,则当不满足条件时分配空值。在不允许空值的情况下,更新将失败。您最终的“高效”查询是无效的 sql,至少在 TSQL 中是这样。您是否在特定引擎上对此进行了测试并且对您有效? 我在 SQL Server 2005 上对此进行了测试,如图所示,它运行良好。我很想知道为什么它被否决以及一个显示 NULL 值被更新的示例,因为在我上面的测试中,null 值没有更新。我一直认为最简单的答案是最好的,如果我正在处理一个包含数百万条记录的数据库,我肯定不想去更新不必要的行。【参考方案2】:

我知道这是一个非常古老的问题,但这对我有用:

UPDATE TABLE SET FIELD1 =
CASE 
WHEN FIELD1 = Condition1 THEN 'Result1'
WHEN FIELD1 = Condition2 THEN 'Result2'
WHEN FIELD1 = Condition3 THEN 'Result3'
END;

问候

【讨论】:

【参考方案3】:

我知道这是一个非常古老的问题,并且该问题已标记为已修复。但是,如果有人像我这样的情况,表有更新事件的数据记录触发器,这将导致问题。这两列都将获得更新,而日志将生成无用的条目。我的方式

IF (CONDITION) IS TRUE
BEGIN
    UPDATE table SET columnx = 25
END
ELSE
BEGIN
    UPDATE table SET columny = 25
END

现在这有另一个好处,它不像上面的解决方案那样在表上进行不必要的写入。

【讨论】:

这是一个好点和好选择!我不再使用导致该线程的原始代码,但是有不同的解决方案总是好的,我认为这是一个很好的解决方案【参考方案4】:

我想使用 Case 语句将我的 ContactNo 更改或更新为 8018070999,其中有 8018070777

update [Contacts] set contactNo=(case 
when contactNo=8018070777 then 8018070999
else
contactNo
end)

【讨论】:

为此为什么不使用此查询 UPDATE [Contacts] SET contactNo = 8018070999 WHERE contactNo = 8018070777【参考方案5】:

您不能使用条件来更改查询的结构,只能更改所涉及的数据。你可以这样做:

update table set
    columnx = (case when condition then 25 else columnx end),
    columny = (case when condition then columny else 25 end)

这在语义上是相同的,但请记住,两列都将始终更新。这可能不会给您带来任何问题,但是如果您的事务量很大,那么这可能会导致并发问题。

具体您要求的唯一方法是使用动态 SQL。但是,我建议您远离这种情况。上面的解决方案几乎肯定足以满足您的需求。

【讨论】:

我同意动态 SQL。那么我的数据会受到影响吗?我的意思是我不希望它在某些情况下改变。所以它只会重新插入已经存在的东西?对 db 的点击量可能还不错。 @pqsk:这不应该影响您的数据,它应该只是重新插入已经存在的任何列应该受到影响。 谢谢。我打算这样做。如此简单,即使是穴居人也能做到。哈哈。 @AdamRobinson 1.5 年过去了你知道一些更有效的方法来只更新一列 @Somebodyisintrouble:更新一列的唯一方法是使用不同的查询。【参考方案6】:
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END

【讨论】:

您是否只是复制了亚当的回复,还是从其他地方获取的?哈哈。刚刚注意到。 @pqsk:我们的回复相差约 1 分钟,所以我想我只是点击提交的速度快了一点;) @pqsk:是的,我刚刚复制了亚当的回复,23 在他发布之前几秒钟。我是一个快速的复制者! @pqsk:如果您将光标放在* min ago 上,它将显示发布的确切时间。 公平地说,尽管两者是相同的:如果 Adam 会在你的之后出现,他确实会详细说明。这就是为什么我将他标记为答案。不过还是谢谢。

以上是关于T-SQL:在 UPDATE 语句中使用 CASE 根据条件更新某些列的主要内容,如果未能解决你的问题,请参考以下文章

MS T-SQL UPDATE语句

在带有 CASE 语句的 UPDATE 上使用 LAG()

楼梯T-SQL:超越基础6级:使用CASE表达式和IIF函数

多个 case 语句/多个 Update 语句

在 T-SQL CASE 语句的 WHEN 条件中设置变量等于数字时语法不正确[关闭]

Redshift 中的 update + case + join 语句