首页 > 解决方案 > 更新 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 函数来做到这一点

标签: jsonpostgresqljsonbpostgresql-9.5

解决方案


首先,让我们考虑将列存储为 JSON 或 JSONB,它们已被定义为正确保存数据并以高效的方式使用,例如不需要在类型之间进行转换,例如以 DATE 格式保存 DATE 值而不是 STRING。

在这种情况下,我考虑contextJSONB 数据类型中的列。

您可以使用JSONB_SET()函数来获得所需的结果,其中第一个参数(目标)可能是数组格式,方法是使用JSONB_BUILD_ARRAY()带有索引的函数(如本例0所示'{0,details}'),以便通过以下 DML 语句轻松操作:

UPDATE instances
   SET context = 
          JSONB_SET(JSONB_BUILD_ARRAY(context), '{0,details}','[{"binduserid":1000619}]')

Demo


推荐阅读