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