如何在pgAdmin中用替换的值更新jsonb列?(二)

本文详细描述了如何在PostgreSQL的pgAdmin中处理嵌套的jsonb数据,包括构建json对象、使用jsonb_set函数进行替换,并演示了如何修改嵌套层级中的特定字段。
摘要由CSDN通过智能技术生成

上一篇提到怎么替换jsonb,链接如下:

如何在pgAdmin中用替换的值更新jsonb列?-CSDN博客

那么当jsonb嵌套jsonb应该怎么替换呢?像这样,类型依然是jsonb,只不过嵌套一层,JsonData:"{}",这就不得不提一下这种数据结构是怎么来的。

首先构造一个正常的jsonb,如下:

--jsonb_build_object函数就能够帮助构造一个Json对象
SELECT jsonb_build_object('name', 'John', 'age', 30, 'gender', 'male');

展开来看下里面怎么存的

第二步骤,我们嵌套一层Json

--此处将第一步骤构造的Json对象转化为text再被当作嵌套后的值
--jsonb_build_object('name', 'John', 'age', 30, 'gender', 'male')::text 
SELECT jsonb_build_object('JsonData',jsonb_build_object('name', 'John', 'age', 30, 'gender', 'male')::text);

再展开看下效果,可以看见第一步骤中的json已经变成text并且被加了转义符 \" 

至此,文章开头提到的嵌套Json我们就拿到了。

题外话,那么再嵌套一层会怎样呢?好的继续嵌套。

SELECT jsonb_build_object('JsonData',jsonb_build_object('JsonData',jsonb_build_object('name', 'John', 'age', 30, 'gender', 'male')::text)::text);

展开看效果:又多加了一层转义符

知道了嵌套Json是怎么来的以后,想写替换语句就容易了。

思路:构造一个一样的Json结构直接set进去就好了。

--先查一下看效果是否更改url成功
select "Id" as id, jsonb_build_object('JsonData', jsonb_set(("BuildInTemplate"::jsonb ->> 'JsonData')::jsonb, '{$template, url}', '"https://blog.csdn.net/CSDN_wcy?type=blog"' )::text) as data
from "Test_Template"
where "IHLFlag"=2 and "BuildInTemplate" is not null
;

begin;
update "Test_Template"
set "BuildInTemplate" = jsonb_build_object('JsonData', jsonb_set(("BuildInTemplate"::jsonb ->> 'JsonData')::jsonb, '{$template, url}', '"https://blog.csdn.net/CSDN_wcy?type=blog"' )::text)
where "IHLFlag"=2 and "BuildInTemplate" is not null;

-- commit;
rollback;

衍生的问题,既然可已嵌套Json,那么想不显示转义符的Json在pgAdmin中方便查阅又怎么做呢?

思路:我们知道嵌套相当于Jsonb被转成text存到value里,那么我们就按text格式查出来再转回Jsonb。既存jsonb - text,取text - jsonb。

--  ->>符号意思是按text取,->符号意思是按jsonb取
select "Id",("BuildInTemplate"->>'JsonData')::jsonb as "Data" from public."Test_Template"

看效果:

补充:如果想改jsonb下的数组里某个字段呢?如下:

update "Test_Template"
set "BuildInTemplate" = jsonb_build_object('JsonData', jsonb_set(("BuildInTemplate"::jsonb ->> 'JsonData')::jsonb, '{additionalData, certSignatories, 0, position}', '"DIRECTOR|ACADEMY FOR CONTINUING EDUCATION"' )::text)
where "Id"='187de35c-xxxx-16ab-838d-f6f7a88ec459';

update "Test_Template"
set "BuildInTemplate" = jsonb_build_object('JsonData', jsonb_set(("BuildInTemplate"::jsonb ->> 'JsonData')::jsonb, '{additionalData, certSignatories, 1, position}', '"PRINCIPAL & CEO|REPUBLIC POLYTECHNIC"' )::text)
where "Id"='187de35c-xxxx-16ab-838d-f6f7a88ec459';

参考链接:

PostgreSQL 如何在PostgreSQL中解析JSON|极客笔记 (deepinout.com)

官方文档 翻译版:

JSON 函数和操作符 (postgres.cn)

仅供学习参考,如有侵权联系我删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值