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

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

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

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

pqsk asked 2019-09-11T08:54:43Z
5个解决方案
160 votes

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

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

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

具体做你要问的唯一方法是使用动态SQL。 然而,这是我鼓励你远离的东西。 上面的解决方案几乎肯定足以满足您的需求。

Adam Robinson answered 2019-09-11T08:55:09Z
20 votes
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END
Quassnoi answered 2019-09-11T08:55:26Z
1 votes

enter image description here

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

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

enter image description here

Debendra Dash answered 2019-09-11T08:55:51Z
1 votes

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

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

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

Harsh answered 2019-09-11T08:56:21Z
-1 votes

我相信您可以通过调整其他答案来省略更新“非期望”列,如下所示:
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]

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

阅读完所有评论后,这是最有效的:
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]

样本表:
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

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

John Greiner answered 2019-09-11T08:58:01Z
translate from https://stackoverflow.com:/questions/4830191/t-sql-using-a-case-in-an-update-statement-to-update-certain-columns-depending-o