PostgreSQL使用jsonb进行数组增删改查的操作详解

 更新时间:2024年03月15日 11:29:18   作者:weihubeats  
有时候我们需要使用PostgreSQL这种结构化数据库来存储一些非结构化数据,PostgreSQL恰好又提供了json这种数据类型,这里我们来简单介绍使用jsonb的一些常见操作,需要的朋友可以参考下

PostgreSQL 提供了 json和 jsonb两种 json类型,两者的主要区别就是,json查询相对慢一些,插入会快一点,而jsonb则相反,查询效率会高一点,插入会慢一点。

下面进入我们今天的正题

表结构

create table purchase_order
(
    id                     serial not null primary key,
    tag                    jsonb
)

数据也是非常简单

INSERT INTO purchase_order (id, tag) VALUES (4787, '[{"uid": 1, "name": "标签名1", "add_time": "2021-05-29 17:00:00"}, {"uid": 2, "name": "标签名2", "add_time": "2021-05-29 17:00:00"}]');

重点是tag

[{
	"uid": 1,
	"name": "标签名1",
	"add_time": "2021-05-29 17:00:00"
}, {
	"uid": 2,
	"name": "标签名2",
	"add_time": "2021-05-29 17:00:00"
}]

操作

这里来实现一些简单的操作

条件查询

我们查询 id = 4787 且 json 中 uid = 1 的tag

-- 嵌套子查询
select * from (
select jsonb_array_elements(tag) as tt from purchase_order where id =  4787) a
where  tt -> 'uid' = '1';

-- 或者这种方式
SELECT
    id,r
FROM
    purchase_order s, jsonb_array_elements(s.tag) r
WHERE
    s.id =  4787  and r->>'uid' = '2' ;

查询结果

如果仅仅是查询json中包含 uid = 3的结果可以像这样查询

SELECT tag FROM purchase_order
WHERE id =  4787 and tag @> '[{"uid": 3}]';

新增

新增也比较简单,我们在原有的json上在增加个对象。
原先的json对象是这样的

[{
	"uid": 1,
	"name": "标签名1",
	"add_time": "2021-05-29 17:00:00"
}, {
	"uid": 2,
	"name": "标签名2",
	"add_time": "2021-05-29 17:00:00"
}]

执行如下语句

UPDATE purchase_order SET tag = tag || '[{
	"uid": 3,
	"name": "标签名3",
	"add_time": "2021-05-29 17:00:00"
}]' where  id = 4787;

再查询

[{
	"uid": 1,
	"name": "标签名1",
	"add_time": "2021-05-29 17:00:00"
}, {
	"uid": 2,
	"name": "标签名2",
	"add_time": "2021-05-29 17:00:00"
}, {
	"uid": 3,
	"name": "标签名3",
	"add_time": "2021-05-29 17:00:00"
}]

删除

如果我要删除上面 uid 为3的值,使用如下sql即可

UPDATE purchase_order
       SET tag = t.js_new
      FROM
          (
           SELECT jsonb_agg( (tag ->> ( idx-1 )::int)::jsonb ) AS js_new
             FROM purchase_order
            CROSS JOIN jsonb_array_elements(tag)
             WITH ORDINALITY arr(j,idx)
            WHERE j->>'uid' NOT IN ('3')
          ) t;

再次查询

修改

我们现在要把 id = 4787name = '标签名1'的修改为name = '标签new'

sql 如下

UPDATE purchase_order AS g
   SET tag = REPLACE(tag::text, '"name": "标签名1"','"name": "标签new"')::json
 WHERE g.tag IN ( SELECT g.tag
                     FROM purchase_order AS g
                    CROSS JOIN jsonb_array_elements(g.tag) AS j
                    WHERE id = 4787 and  j ->>'uid' = '1' )

总结

其实还有很多其他方式去实现,但是总体来说修改删除都不是特别方便和好维护,建议修改删除的时候直接当做字符串去全量更新即可,这样好维护一点。

另外附带一份官方的 jsonb 操作文档连接给大家自己去查阅吧

PostgreSQL: Documentation: 9.6: JSON Functions and Operators

注意文档选择合适的版本哦

以上就是PostgreSQL使用jsonb进行数组增删改查的操作详解的详细内容,更多关于PostgreSQL jsonb增删改查的资料请关注脚本之家其它相关文章!

相关文章

  • PostgreSQL工具pgAdmin的介绍及使用

    PostgreSQL工具pgAdmin的介绍及使用

    本文主要介绍了PostgreSQL工具pgAdmin的介绍及使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • PostgreSQL 查看表的主外键等约束关系详解

    PostgreSQL 查看表的主外键等约束关系详解

    这篇文章主要介绍了PostgreSQL 查看表的主外键等约束关系详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgresql 存储过程(plpgsql)两层for循环的操作

    Postgresql 存储过程(plpgsql)两层for循环的操作

    这篇文章主要介绍了Postgresql 存储过程(plpgsql)两层for循环的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • mac装PostgreSQL安装失败的问题及解决

    mac装PostgreSQL安装失败的问题及解决

    这篇文章主要介绍了mac装PostgreSQL安装失败的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • PostgreSql 导入导出sql文件格式的表数据实例

    PostgreSql 导入导出sql文件格式的表数据实例

    这篇文章主要介绍了PostgreSql 导入导出sql文件格式的表数据实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgresql 数据库转义字符操作

    Postgresql 数据库转义字符操作

    这篇文章主要介绍了Postgresql 数据库转义字符操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 自定义函数实现单词排序并运用于PostgreSQL(实现代码)

    自定义函数实现单词排序并运用于PostgreSQL(实现代码)

    这篇文章主要介绍了自定义函数实现单词排序并运用于PostgreSQL,本文给大家分享实现代码,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • CentOS 7下安装PostgreSQL 9.6的教程分享

    CentOS 7下安装PostgreSQL 9.6的教程分享

    PostgreSQL在我心目中的地位要远远高于MySQL,虽然流行对比MySQL低很对,但是功能性一致走在MySQL的前面。下面这篇文章主要介绍了CentOS 7下安装PostgreSQL数据库的方法,需要的朋友可以参考借鉴,一起来看看吧。
    2017-02-02
  • PostgreSQL 数据库跨版本升级常用方案解析

    PostgreSQL 数据库跨版本升级常用方案解析

    这篇文章主要介绍了PostgreSQL 数据库跨版本升级常用方案解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • PostgreSQL数据库命令行执行SQL脚本的三种方式

    PostgreSQL数据库命令行执行SQL脚本的三种方式

    生成环境中,出于安全性等原因,往往不提供数据库连接工具,所以对数据库的更新和升级就得通过命令行来实现,本文总结了三种命令行执行sql脚本的方式,需要的朋友可以参考下
    2024-02-02

最新评论