这是一个非常基本的问题,但是我找不到更好的方法来做到这一点,而且我感觉自己会以错误的方式进行操作。
基本上,我在表格的列中有两个值,我想更新为两个不同的值。
因此,假设我有一个列name
,其值为My Name
,我想将其更改为Updated My Name
,但是如果我也具有值{{ 1}},我想将其更新为My Name222
。当前,我有两个Update SQL调用,如下所示:
Updated My Name222
正如我之前提到的,这种方法确实有效,但是我觉得有更好的方法来背对背执行此操作,而不必两次调用UPDATE myTable t
SET "name"='My Name' WHERE "name"= 'Updated My Name';
UPDATE myTable t
SET "name"='My Name222' WHERE "name"= 'Updated My Name222';
。怎么会这样?
答案 0 :(得分:3)
有一种使用case
在单个语句中执行此操作的方法:
update my_table
set name = case name
when 'My Name' then 'Updated My Name'
else 'Updated My Name222'
end
where name in ('My Name', 'My Name222');
在这种情况下,两个单独的更新更为简单自然。
但是,如果您想以完全相同的方式修改两行中的列值,则此解决方案更有意义:
update my_table
set name = concat('Updated ', name)
where name in ('My Name', 'My Name222');
答案 1 :(得分:2)
我个人喜欢将values()
用于此类事情:
update my_table
set name = newname
from (values ('My Name', 'Updated My Name'),
('My Name222', 'Updated My Name222')
) v(oldname, newname)
where name = oldname;
与显式case
表达式相比,它具有一些优点。首先,它易于推广-只需向v
添加更多行。其次,您不必重复任何值,从而减少了犯错的机会。
答案 2 :(得分:1)
另一种方式
UPDATE tablename
SET name = CASE WHEN name = 'Updated My Name' THEN 'My Name'
WHEN name = 'Updated My Name222' THEN 'Name222'
END
where name in ('My Name', 'My Name222');