sql - 使用 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)?
解决方案
假设您没有更新到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;
推荐阅读
- android - 生成主 dex 列表时反应本机错误
- sql-server - 为数据目录收集元数据
- arrays - 检查表项是否不存在。如果为空,如何检查返回的“项目”数组?Javascript/DynamoDB
- maximo - 如何以编程方式访问 Maximo 列表 where 子句
- react-native - 我的 FlatList 中有一个 Header 组件,如何使第一个 Item 与 Header 的底部重叠?
- embedded - 当微控制器的手册说“检查 XX 是否发生”时,如果没有,应该怎么办?
- r - 为什么我的 Tukey 测试(来自 Agricolae)为空?
- c# - 更新 MediaPlayerElement 周围的背景颜色
- git - git 权限更改 pycharm 与分支比较
- php - php 和 mysql 在 date_begin 和 date_end 之间显示每日收入