• 售前

  • 售后

热门帖子
入门百科

postgres之jsonb属性的使用操纵

[复制链接]
123456811 显示全部楼层 发表于 2021-8-14 14:57:55 |阅读模式 打印 上一主题 下一主题
jsonb的一些简单操纵(增编削查)

1、更新操纵(attributes属性为jsonb范例)

方法定义:
  1. jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])
复制代码
参数:
  1. target
复制代码
:目标(jsonb范例的属性)
  1. path
复制代码
:路径,如果jsonb是数组‘{0,a}'体现在下标是0的位置更新a属性,如果不是数组,是对象,则写‘{a}'即可
  1. new_value
复制代码
:新值
选填参数:create_missing:jsonb字段不存在f1属性时创建,默以为true
返回:更新后的jsonb
官方文档给出的示例(jsonb数组):
  1. jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false)
  2. 结果:[{"f1":[2,3,4],"f2":null},2,null,3]
  3. jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}','[2,3,4]')
  4. 结果:[{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]
复制代码
更新jsonb属性:
  1. -- attributes为jsonb类型字段(对象转成的json)
  2. 原值:{"a":"1"}
  3. update user_test set attributes = jsonb_set(attributes,'{a}','"0"'::jsonb, false) where id = '8888';
  4. 执行后:{"a":"0"}
复制代码
为jsonb插入属性:
  1. -- 执行后attributes字段中添加了platform:baidu
  2. update user_test set attributes =  attributes::jsonb || '{"platform":"baidu"}'::jsonb;
  3. 或者:
  4. update user_test set attributes = jsonb_set(attributes, '{platform}','"baidu"');
复制代码
查询
  1. select value from json_each('{"a":"foo", "b":"bar"}') where key = 'a'
  2. select * from json_object_keys('{"a":"foo", "b":"bar"}')
  3. select * from json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}')
  4. select  * from json_object_keys(from ci_type.attributes);--错误
  5. select * from to_jsonb('"a":1,"b":2')
  6. select '{"a":1,"b":2}'::json->>'b' --获取jsonb中对应键的值(文本)
  7. --select * from json_each( to_jsonb(select distinct attributes from ci_type ) )
  8. --select to_jsonb(select distinct attributes from ci_type )
  9. --扩展字段提取相应属性的值
  10.   select  attributes :: json->>'instanceType' from ci_type
  11. -- 属性值转为jsonb
  12. select to_jsonb('id:'||id::text) from ci
  13. --jsonb添加属性,删除属性
  14. select '{"a":"foo", "b":"bar"}'::jsonb || '{"c":"fc", "d":"bdd"}'::jsonb--添加
  15. select '{"a":"foo", "b":"bar"}'::jsonb -'c'-'d'-'a'||'{"a":2}'--删除
  16. select '{"a": "b","c":3}'::jsonb - 'a'
  17. -- 根据路径获取json对象:#>
  18. SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> '{b,ba}'
  19. 结果:"b1"
  20. SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> '{b}'
  21. 结果:{"ba":"b1","bb":"b2"}
  22. -- 根据路径获取json对象为text:#>>
  23. SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #>> '{b,ba}'
  24. 结果:"b1"
复制代码
增补一下吧
1、to_jsonb()方法接受一个参数,将参数转换为jsonb
  1. jsonb存储毫秒值字段
  2. # 更新user表中attributes字段中的create_time字段为当前时间
  3. update user_test
  4. set attributes = jsonb_set(attributes,'{create_time}',to_jsonb(extract(epoch from now())*1000), true)
复制代码
2、extract(epoch from now())*1000 获取毫秒值
  1. EXTRACT(field FROM source)
复制代码
field 体现取的时间对象,source 体现取的日期来源,范例为 timestamp、time 或 interval。
  1. EXAMPLE:select extract(year from now());
复制代码
  1. extract(epoch from now())
复制代码
查察现在距1970-01-01 00:00:00 UTC 的秒数
  1. epoch
复制代码
:新纪元时间 Epoch 是以 1970-01-01 00:00:00 UTC 为标准的时间,将目标时间与 1970-01-01 00:00:00时间的差值以秒来盘算 ,单位是秒,可以是负值;
postgresql操纵jsonb数组

先看表布局:
  1. create table person
  2. (id int, --  唯一标识
  3. label jsonb); -- 人的标签数组(指明某人是哪个公司的),标签时一个一个的对象
复制代码
label字段数据实例
  1. [{"id":1,"code":"p123","name":"ali"},{"id":2,"code":"p123","name":"ali"}]
复制代码
要求:写sql实现添加一个标签,删除一个标签,清空标签;
1、添加一个标签

直接使用 || 符号将两个jsonb连接成一个jsonb
  1. -- 当label为null时
  2. update person set label =  '{"id":1,"code":"p123","name":"ali"}'::jsonb;
复制代码
  1. -- label不为null时运行
  2. update person set label =  '{"id":1,"code":"p123","name":"ali"}'::jsonb || label
复制代码
注意:当label为null时这样实验末了得到的也是null
2、清空标签

这个比力简单,我直接设置为null
  1. update person set label = null;
复制代码
3、删除一个标签

这个就比力贫苦一点,我用到了
  1. -> ->> jsonb_array_elements() jsonb_build_array() array()
复制代码
不熟悉这些符号和函数的用法的看:http://www.postgres.cn/docs/10/datatype-json.html
  1. update person
  2. set label = jsonb_build_array(
  3.     array( -- 不使用该函数,当筛选出有多于2跳数据时会报错,因为jsonb_build_array函数只能有一个json
  4.         (select * from
  5.          (select jsonb_array_elements(label)j from person where id = 1)as a
  6.          where (j->>'id')::int <> 1) -- 筛选出要删除的对象
  7.     )
  8. )->0 -- 如果不加这个你会得到两个[[]]的数组
  9. where id = 1;
复制代码
以上就是我办理pg中操纵jsonb数组的方法,希望能给各人一个参考,也希望各人多多支持脚本之家.

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作