使用postgres

时间:2018-08-13 17:08:09

标签: sql postgresql sql-update

这是一个非常基本的问题,但是我找不到更好的方法来做到这一点,而且我感觉自己会以错误的方式进行操作。

基本上,我在表格的列中有两个值,我想更新为两个不同的值。

因此,假设我有一个列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'; 。怎么会这样?

3 个答案:

答案 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');