PostgreSQL操作JSON数据

前言

PostgreSQL提供了两种存储JSON数据的类型:json和jsonb;

jsonb是json的二进制形式。
json格式写入快,但读取慢;
jsonb格式写入慢,但读取快;

常用语法

 // -> 返回json
 select '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 // 输出 {"c":"baz"}
 select '{"a": {"b":"foo"}, "c":{"a": "aaa"}}'::json->'a' // 输出 {"b":"foo"}
 
 // ->> 返回文本
 select '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->>2 // 输出 {"c":"baz"}
 select '{"a": {"b":"foo"}, "c":{"a": "aaa"}}'::json->>'a' // 输出 {"b":"foo"}

 // #> 获取json子对象
 select '{"a": {"b":{"c": "foo"}}}'::json#> '{a,b}' // 输出 {"c": "foo"}
 select '{"a": {"b":{"c": "foo"}}}'::json#>> '{a,b}' // 输出 {"c": "foo"}

 // @> ———— 判断第一个json是否包含第二个
 select '{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb   //输出t
 // <@ ———— 判断第一个json是否在第一个中
 select '{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb   //输出t

常用操作符

在这里插入图片描述

实例操作

数据库表(test_pgsql):
在这里插入图片描述

第一条data为json类型的数组:

[
	{
	    "username": "张三",
	    "age": "18",
	    "sex": "男"
	  },
	{
	    "username": "张三",
	    "age": "25",
	    "sex": "男"
	  },
	{
	    "username": "马冬梅",
	    "age": "20",
	    "sex": "女"
	  }
]

第二条data内容为json类型的对象:

{
    "course":[
        {
            "id":"1",
            "course":"语文",
            "score":"75"
        },
        {
            "id":"2",
            "course":"数学",
            "score":"100"
        }
    ],
    "student":{
        "name":"小王",
        "age":"22"
    }
}

1、查询数组的长度:

// 结果为4
select jsonb_array_length(t."data"::jsonb) from test_pgsql t WHERE t.id = 1;

2、查询数组中第二个元素

//数组索引从0开始,结果为{"age": "25", "sex": "男", "username": "张三"}
select t."data"::jsonb->>1 from test_pgsql t WHERE t.id = 1;

3、查询data中所有的username

select json_array_elements(t."data"::json) #> '{username}' as guid from test_pgsql t where t."id" = 1;

//username去重
select distinct guid|| '' from (select json_array_elements(t."data"::json) #> '{username}' as guid from test_pgsql t where t."id" = 1) tmp;

结果:
在这里插入图片描述

4、json_object_keys 用法
说明:json_object_keys 不能用于纯数组

//获取json中的键
select json_object_keys(t."data"::json) from test_pgsql t where id = 2;

结果:
在这里插入图片描述

5、json_array_elements 用法

//json_array_elements用于提取转换纯数组元素,将数组拆分为单独记录
select json_array_elements(t."data"::json) from test_pgsql t WHERE t.id = 1;

结果:
在这里插入图片描述

6、json_extract_path 用法
说明:json_extract_path不能直接操作纯数组

//查询json中指定键(student)的值,结果为 {"name": "小王", "age": "22"}
select json_extract_path(t."data"::json, 'student') from test_pgsql t where id = 2;
//结果为 "小王"
select json_extract_path(t."data"::json, 'student','name') from test_pgsql t where id = 2;

//和 #>操作符 是一样的
select t."data"::json #>'{student}' from test_pgsql t where id = 2;
select t."data"::json #>'{student,name}' from test_pgsql t where id = 2;

————————————————
版权声明:本文为CSDN博主「秋一叶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36335426/article/details/110630598

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和对专有系统比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server的一种选择。   PostgreSQL 不寻常的名字导致一些读者停下来尝试拼读它,特别是那些把SQL拼读为"sequel"的人。PostgreSQL 开发者把它拼读为 "post-gress-Q-L"。(Audio sample, 5.6k MP3)。它也经常被简略念为 "postgres"。   PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、多版本并发控制。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言。并且,因为许可证的灵活,任何人都可以以任何目的免费使用,修改,和分发 PostgreSQL, 不管是私用,商用,还是学术研究使用。   符合ANSI SQL 92和ANSI SQL 99标准,是目前功能最强、最稳定的开放源代码数据库产品,具有存储过程、事务、视图、触发器等功能,与MySQL相比,PostgreSQL注重整体性能和稳定性。   我们非常高兴的宣布 PostgreSQL 9.3 正式版发布了,该版本包含可写的外部数据封装、数据页 checksums、快速的故障转移以及 streaming-only remastering 等等。   外部数据封装可写使得系统间支持双路数据交换。今天非常复杂的 IT 环境涉及到多个数据库和半结构化的数据源,而 PG 可帮你将它们集成在一起。该项目同时发布了 postgres_fdw ,这是一个高性能的支持读写的联合驱动程序。   此外,该版本提升了可靠性和可用性,实现了快速的故障转移;数据页的 checksum。此外在复杂的复制环境中,可在故障发生时迅速转移主数据节点。   在针对开发者方面改进包括: 额外的 JSON 构建和解析方法 自动可更新的视图 并行 pg_dump 用于加速大数据库的备份 LATERAL JOINs

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值