PostgreSQL操作jsonb数组
本文参考:pg中文网文档
https://www.cnblogs.com/MonkChen/p/5882615.html
操作json符号和函数文档:http://www.postgres.cn/docs/10/functions-json.html#FUNCTIONS-JSONB-OP-TABLE
先看表结构:
create table person
(id int, -- 唯一标识
label jsonb); -- 人的标签数组(指明某人是哪个公司的),标签时一个一个的对象
label字段数据实例
[{"id":1,"code":"p123","name":"ali"},{"id":2,"code":"p123","name":"ali"}]
要求:写sql实现添加一个标签,删除一个标签,清空标签;
- 添加一个标签
直接使用 ||
符号将两个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
- 清空标签
这个比较简单,我直接设置为null
update person set label = null;
- 删除一个标签
这个就比较麻烦一点,我用到了 ->
->>
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数组的方法,有更好的方法大家一起交流!