首页 > 解决方案 > 使用 PostgreSQL 更新多行

问题描述

我需要使用 PostgreSQL 在同一个 sql 事务中更新多行。从下面的帖子: 使用 PostgreSQL 更新同一查询中的多行 我看到以下代码:

UPDATE test AS t SET
column_a = c.column_a,
column_c = c.column_c
FROM (values
  (123, 1, '---'),
  (345, 2, '+++')  
) AS c(column_b, column_a, column_c) 
WHERE c.column_b = t.column_b;

但是,只有当您更新每组值的所有列时,我才不会这样做。有没有人对此有解决方案来允许多个更新仅使用 SQL(而不是 plpgsql)?

标签: sqlpostgresql

解决方案


假设您没有更新到NULL值,您可以使用:

UPDATE test t
    SET column_a = COALESCE(c.column_a, t.column_a),
        column_c = COALESCE(c.column_c, t.column_c
FROM (values ('123', 1, NULL),
             ('345', NULL, '+++')  
     ) c(column_b, column_a, column_c) 
WHERE c.column_b = t.column_b;

编辑:

如果值可以是NULL,那么您需要额外的列来指定是否应该使用该值:

UPDATE test t
    SET column_a = (CASE WHEN c.use_a THEN c.column_a::numeric ELSE t.column_a END),
        column_c = (CASE WHEN c.use_b THEN c.column_c::varchar ELSE t.column_c END)
FROM (values (123, 1, NULL, true, false),
             (345, NULL, '+++', false true)  
     ) c(column_b, column_a, column_c, use_a, use_c) 
WHERE c.column_b::int4 = t.column_b;

推荐阅读