在单个查询中更新多行的不同列

时间:2017-10-08 13:19:53

标签: sql postgresql

假设我们有下表:

id | col_a | col_b | col_c
1  |   abc |  null |  qwqw
2  |  null |  null |  null
3  |  null |  ijij |  cba

我们想要进行以下更新:

  • 第1行:SET col_a = cba
  • 第2行:SET col_b = uiui,col_c = zxzx
  • 第3行:SET col_b = null

首先,是否可以在一个查询中执行此操作?

如果没有,最好的选择是什么?

  • 每行一个查询,例如UPDATE表SET ... WHERE id = 1;
  • 获取行,用新值替换旧值,并执行大量INSERT INTO表VALUES ... ON CONFLICT(id)DO UPDATE SET col_a = EXCLUDED.col_a,col_b = EXCLUDED.col_b,col_c = EXCLUDED .col_c;
  • 别的什么?

1 个答案:

答案 0 :(得分:1)

最简单的方法是三个updates

update t
    set col_a = cba
    where id = 1;

update t
    set col_b = uiui, col_c = zxzx
    where id = 2;

update t
    set col_b = null
    where id = 3;

您可以将它们包装在一个事务中,以便它们同时生效。假设你有id的索引,这应该有很好的表现。

您可以使用条件逻辑将它们放入单个语句中:

update t
    set col_a = (case when id = 1 then cba else col_a end),
        col_b = (case when id = 2 then uiui 
                      when id = 3 then null
                      else col_b
                 end),
        col_c = (case when id = 2 then zxzx else col_c end)
    where id in (1, 2, 3);

我认为三个单独的陈述更清晰,更不容易出错。