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

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

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

我到处寻找,试验了一些东西,但是没有找到解决的办法。我认为这是不可能的,但我想我会问在这里,看看是否有人这样做过。

353785 次浏览
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
columny = CASE WHEN condition THEN columny ELSE 25 END

You can't use a condition to change the structure of your query, just the data involved. You could do this:

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

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

完成您要求的 特别是操作的唯一方法是使用动态 SQL。不过,我建议你远离这种事。上述解决方案几乎肯定足以满足您的需求。

我相信你可以省略更新“不理想”栏目,把其他答案调整如下:

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

据我所知,这只有在满足条件时才会更新。

After reading all the comments, this is the most efficient:

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当且仅当 ColContionary 为 True (1) ,而 Y 改为25当且仅当 ColContionary 为 False (0)

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

附言。在最初的问题或问题的任何更新中都没有提到 null 情况,但是正如您所看到的,这个非常简单的答案无论如何都会处理它们。

enter image description here

我想更改或更新我的联系人号码为8018070999,其中有8018070777使用案例语句

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

enter image description here

我知道这是一个非常古老的问题,这个问题被标记为已修复。但是,如果有人遇到类似的情况,即表具有更新事件上的数据日志记录触发器,这将导致问题。这两个列都会得到更新,而日志会产生无用的条目。就像我一样

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

现在这样做还有另一个好处,即它不会像上述解决方案那样在表上进行不必要的写操作。

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

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