postgres之jsonb属性的使用操作


Posted in PostgreSQL onJune 23, 2021

jsonb的一些简单操作(增删改查)

1、更新操作(attributes属性为jsonb类型)

方法定义:

jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])

参数:

target:目标(jsonb类型的属性)

path :路径,如果jsonb是数组‘{0,a}'表示在下标是0的位置更新a属性,如果不是数组,是对象,则写‘{a}'即可

new_value:新值

选填参数:create_missing:jsonb字段不存在f1属性时创建,默认为true

返回:更新后的jsonb

官方文档给出的示例(jsonb数组):

jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false)
结果:[{"f1":[2,3,4],"f2":null},2,null,3]
jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}','[2,3,4]')
结果:[{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]

更新jsonb属性:

-- attributes为jsonb类型字段(对象转成的json)
原值:{"a":"1"}
update user_test set attributes = jsonb_set(attributes,'{a}','"0"'::jsonb, false) where id = '8888';
执行后:{"a":"0"}

为jsonb插入属性:

-- 执行后attributes字段中添加了platform:baidu
update user_test set attributes =  attributes::jsonb || '{"platform":"baidu"}'::jsonb;
或者:
update user_test set attributes = jsonb_set(attributes, '{platform}','"baidu"');

查询

select value from json_each('{"a":"foo", "b":"bar"}') where key = 'a'
select * from json_object_keys('{"a":"foo", "b":"bar"}')
select * from json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}')
select  * from json_object_keys(from ci_type.attributes);--错误
select * from to_jsonb('"a":1,"b":2') 
 select '{"a":1,"b":2}'::json->>'b' --获取jsonb中对应键的值(文本)
 --select * from json_each( to_jsonb(select distinct attributes from ci_type ) )
 --select to_jsonb(select distinct attributes from ci_type ) 
 
--扩展字段提取相应属性的值
  select  attributes :: json->>'instanceType' from ci_type 
-- 属性值转为jsonb
select to_jsonb('id:'||id::text) from ci
--jsonb添加属性,删除属性
select '{"a":"foo", "b":"bar"}'::jsonb || '{"c":"fc", "d":"bdd"}'::jsonb--添加
select '{"a":"foo", "b":"bar"}'::jsonb -'c'-'d'-'a'||'{"a":2}'--删除
select '{"a": "b","c":3}'::jsonb - 'a'
-- 根据路径获取json对象:#>
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> '{b,ba}'
结果:"b1"
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> '{b}'
结果:{"ba":"b1","bb":"b2"}
-- 根据路径获取json对象为text:#>>
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #>> '{b,ba}'
结果:"b1"

补充一下吧

1、to_jsonb()方法接受一个参数,将参数转换为jsonb

jsonb存储毫秒值字段
# 更新user表中attributes字段中的create_time字段为当前时间
update user_test
set attributes = jsonb_set(attributes,'{create_time}',to_jsonb(extract(epoch from now())*1000), true)

2、extract(epoch from now())*1000 获取毫秒值

EXTRACT(field FROM source)

field 表示取的时间对象,source 表示取的日期来源,类型为 timestamp、time 或 interval。

EXAMPLE:select extract(year from now());

extract(epoch from now())查看现在距1970-01-01 00:00:00 UTC 的秒数

epoch:新纪元时间 Epoch 是以 1970-01-01 00:00:00 UTC 为标准的时间,将目标时间与 1970-01-01 00:00:00时间的差值以秒来计算 ,单位是秒,可以是负值;

postgresql操作jsonb数组

先看表结构:

create table person 
(id int, --  唯一标识
label jsonb); -- 人的标签数组(指明某人是哪个公司的),标签时一个一个的对象

label字段数据实例

[{"id":1,"code":"p123","name":"ali"},{"id":2,"code":"p123","name":"ali"}]

要求:写sql实现添加一个标签,删除一个标签,清空标签;

1、添加一个标签

直接使用 || 符号将两个jsonb连接成一个jsonb

-- 当label为null时
update person set label =  '{"id":1,"code":"p123","name":"ali"}'::jsonb;
-- label不为null时运行
update person set label =  '{"id":1,"code":"p123","name":"ali"}'::jsonb || label

注意:当label为null时这样执行最后得到的也是null

2、清空标签

这个比较简单,我直接设置为null

update person set label = null;

3、删除一个标签

这个就比较麻烦一点,我用到了

-> ->> jsonb_array_elements() jsonb_build_array() array()

不熟悉这些符号和函数的用法的看:http://www.postgres.cn/docs/10/datatype-json.html

update person 
set label = jsonb_build_array(
    array( -- 不使用该函数,当筛选出有多于2跳数据时会报错,因为jsonb_build_array函数只能有一个json
        (select * from 
         (select jsonb_array_elements(label)j from person where id = 1)as a 
         where (j->>'id')::int <> 1) -- 筛选出要删除的对象
    )
)->0 -- 如果不加这个你会得到两个[[]]的数组
where id = 1;

以上就是我解决pg中操作jsonb数组的方法,希望能给大家一个参考,也希望大家多多支持三水点靠木.

PostgreSQL 相关文章推荐
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
postgresql无序uuid性能测试及对数据库的影响
Jun 11 PostgreSQL
postgres之jsonb属性的使用操作
Jun 23 PostgreSQL
基于PostgreSQL/openGauss 的分布式数据库解决方案
Dec 06 PostgreSQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
Apr 12 PostgreSQL
postgreSQL数据库基础知识介绍
Apr 12 PostgreSQL
PostgreSQL常用字符串分割函数整理汇总
Jul 07 PostgreSQL
PostgreSQL逻辑复制解密原理解析
Sep 23 PostgreSQL
postgresql中如何执行sql文件
May 08 PostgreSQL
postgresql之greenplum字符串去重拼接方式
May 08 PostgreSQL
postgresql无序uuid性能测试及对数据库的影响
Jun 11 #PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 #PostgreSQL
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
Centos环境下Postgresql 安装配置及环境变量配置技巧
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
PostgreSQL将数据加载到buffer cache中操作方法
Apr 16 #PostgreSQL
PostgreSQL存储过程实用脚本(二):创建函数入门
You might like
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
面试常见的js算法题
2017/03/23 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
python获取本机外网ip的方法
2015/04/15 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
python中re模块知识点总结
2021/01/17 Python
戴森西班牙官网:Dyson西班牙
2020/02/04 全球购物
营销总监岗位职责范本
2014/02/26 职场文书
媒体宣传策划方案
2014/05/25 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
SQLServer之常用函数总结详解
2021/08/30 SQL Server
Python函数对象与闭包函数
2022/04/13 Python