Обновите несколько строк, используя PostgreSQL - PullRequest
0 голосов
/ 06 августа 2020

Мне нужно обновить несколько строк в одной транзакции sql, используя PostgreSQL. Из сообщения ниже: Обновите несколько строк в одном запросе, используя 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 (а не plpg sql)?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Предполагая, что вы не обновляете значения 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;

EDIT:

Если значения могут быть 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;
0 голосов
/ 07 августа 2020

Ваше утверждение «это только если вы обновляете все столбцы для каждого набора значений» неверно. Обновление затронет только те столбцы, которые указаны в предложении SET. Поскольку вы принимаете NULL в качестве новых значений, тогда просто прямой набор для указанных c столбцов:

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 ;

См. fiddle , особенно дополнительный column_d.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...