使用postgresql更新多行

6psbrbz9  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(387)

我需要使用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)?

r6hnlfcb

r6hnlfcb1#

假设您没有更新到 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;
k4emjkb1

k4emjkb12#

您的论点“仅当您更新每组值的所有列时”是不正确的。更新将只影响set子句中提到的那些列。由于接受null作为新值,因此只需为特定列设置一个直线:

update test t
    set column_a = c.column_a
      , column_c = c.column_c 
 from (values ('123', 1, NULL, 'Ignored Column')
            , ('345', NULL, '+++','Ignored Column')  
      ) c(column_b, column_a, column_c,column_d) 
where c.column_b = t.column_b ;

见小提琴,特别是附加栏。

相关问题