上一篇提到怎么替换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"
看效果:
参考链接:
PostgreSQL 如何在PostgreSQL中解析JSON|极客笔记 (deepinout.com)
仅供学习参考,如有侵权联系我删除