json - 更新 Postgresql 中 JSON 元素的值
问题描述
我有具有以下表结构的表:
create table instances(
id bigint,
createdate timestamp,
createdby bigint,
lastmodifieddate timestamp,
lastmodifiedby bigint,
context text
)
字段context
包含一个 JSON 数据,即
insert into instances values
(1, '2020-06-01 22:10:04', 20112,'2020-06-01 22:10:04',20112,
'{"id":1,"details":[{"binduserid":90182}]}')
我需要binduserid
使用 postgres 查询将 JSON 元素的所有值替换为值 90182。
我通过使用REPLACE
函数实现了这一点:
update instances
set context = replace(context, '"binduserid":90182','"binduserid":1000619')
有没有其他方法可以通过使用 Postgres JSON 函数来做到这一点
解决方案
首先,让我们考虑将列存储为 JSON 或 JSONB,它们已被定义为正确保存数据并以高效的方式使用,例如不需要在类型之间进行转换,例如以 DATE 格式保存 DATE 值而不是 STRING。
在这种情况下,我考虑context
JSONB 数据类型中的列。
您可以使用JSONB_SET()
函数来获得所需的结果,其中第一个参数(目标)可能是数组格式,方法是使用JSONB_BUILD_ARRAY()
带有索引的函数(如本例0
所示'{0,details}'
),以便通过以下 DML 语句轻松操作:
UPDATE instances
SET context =
JSONB_SET(JSONB_BUILD_ARRAY(context), '{0,details}','[{"binduserid":1000619}]')
推荐阅读
- python - 循环输出到列表或 numpy 数组,也是 NoneTypeError
- duplicates - 使用 COUNT 和 MIN 删除查询。微软访问 2010
- javascript - 可折叠树图 v4 和 Internet Explorer
- javascript - ESLint 抱怨 TypeScript 类型声明在声明之前使用了类型
- erlang - 无法按照牛仔指南开始监听服务器
- sql - 带有连接的单个表的 SQL 总和
- c - 生成一组可以在不保留白名单的情况下进行验证的唯一密钥
- mysql - 更新触发器后的 SQL
- java - 未找到 Apache POI 工作簿类
- ruby - 尝试在本地向 dynamo db 发出请求并收到此错误“读取服务器你好 A:未知协议”