JSON数据的类型

JSON 代表 JavaScript Object
Notation。JSON是开放的标准格式,由key-value对组成。JSON的主要用于在服务器与web应用之间传输数据。

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

jsonb是json的二进制形式。

json格式写入快,但读取慢;
jsonb格式写入慢,但读取快;

常用语法

 // -> 返回jsonselect '[{"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;

示例:

新建表如下:

CREATE TABLE "public"."biz_orders" (  "ID" int8 NOT NULL DEFAULT nextval('"biz_orders_ID_seq"'::regclass),"info" json NOT NULL
);

表初始化语句:

INSERT INTO "biz_orders"("ID", "info") VALUES (1, '{"name":"张三","items":{"product":"啤酒","qty":6}}');
INSERT INTO "biz_orders"("ID", "info") VALUES (2, '{"name":"李四","items":{"product":"辣条","qty":8}}');
INSERT INTO "biz_orders"("ID", "info") VALUES (3, '{"name":"王五","items":{"product":"苹果","qty":18}}');
INSERT INTO "biz_orders"("ID", "info") VALUES (4, '{"name":"赵一","items":{"product":"香蕉","qty":20}}');

使用
1、简单查询

select * from biz_orders;

2、查询使用->操作符,查询json中所有顾客作为键

SELECT info -> 'name' AS customer FROM biz_orders;

3、下面使用->>操作获取所有顾客姓名作为值

SELECT info ->> 'name' AS customer FROM biz_orders;

4、根据json对象的key查询值

SELECTinfo -> 'items' ->> 'product' as product
FROMbiz_orders
ORDER BYproduct;

5、where查询中使用json字段

SELECTinfo ->> 'name' AS customer
FROMbiz_orders
WHEREinfo -> 'items' ->> 'product' = '辣条'

6、case 查询​​​​​​​

SELECTinfo ->> 'name' AS customer,info -> 'items' ->> 'product' AS product
FROMbiz_orders
WHERECAST (info -> 'items' ->> 'qty' AS INTEGER) = 6

7、聚合函数​​​​​​​

SELECTMIN( CAST ( info -> 'items' ->> 'qty' AS INTEGER ) ),MAX( CAST ( info -> 'items' ->> 'qty' AS INTEGER ) ),SUM( CAST ( info -> 'items' ->> 'qty' AS INTEGER ) ),AVG( CAST ( info -> 'items' ->> 'qty' AS INTEGER ) ) 
FROMbiz_orders;

8、类型查询​​​​​​​

SELECTjson_typeof ( info -> 'items' -> 'qty' ) 
FROMbiz_orders;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/577748.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

comfyui api

stable diffusion comfyui的api使用教程_厦门外里科技的技术博客_51CTO博客stable diffusion comfyui的api使用教程&#xff0c;为什么要使用comfyui的api&#xff1f;对比webui的api&#xff0c;它有什么好处&#xff1f;stablediffusion如何实现队列https://blog.51cto.com/u…

HarmonyOS 应用开发之UIAbility组件启动模式

UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景&#xff0c;系统提供了三种启动模式&#xff1a; singleton&#xff08;单实例模式&#xff09;multiton&#xff08;多实例模式&#xff09;specified&#xff08;指定实例模式&#xff09;…

【SpringBoot】【经典面试题】每天10个Java面试题-面试大厂起飞系列-day01

嗨&#xff0c;各位小伙伴&#xff01; &#x1f431;‍&#x1f4bb; 我是【行走的程序喵】&#xff01;一个兼具Web前端和Java后端技能的技术宅&#xff01; &#x1f31f; 我的博客上分享最新的Web前端和Java后端技术文章&#xff0c;从基础入门到进阶应用&#xff0c;应有…

Git相关命令(一)

一、简介 Git 是一个开源的分布式版本控制系统。 当然&#xff0c; git 不会傻傻的把你的每一个版本完整的存储下来&#xff0c;他仅仅会存储每次修改的位置和内容&#xff08;可持久化&#xff09;&#xff0c;每一次 commit 可以理解为产生一个版本&#xff0c;接下来的版本…

HarmonyOS实战开发-实现UIAbility内和UIAbility间页面的跳转

介绍 本篇Codelab基于Stage模型下的UIAbility开发&#xff0c;实现UIAbility内和UIAbility间页面的跳转。包含如下功能&#xff1a; UIAbility内页面的跳转。跳转到指定UIAbility的首页。跳转到指定UIAbility的指定页面&#xff08;非首页&#xff09;。 最终效果图如下&…

【HCIP学习】网络类型级数据链路层协议

思维导图在上面哦~ 一、网络类型的分类&#xff08;4种&#xff09; 出现原因&#xff1a;数据链路层使用的协议及规则不同&#xff0c;造成了不同的网络类型 1、多点接入网络&#xff08;MA&#xff09;------一条网段内上出现多个设备 BMA&#xff1a;广播型多点接入&…

vivado 生成比特流或器件镜像

在生成比特流或器件镜像之前 &#xff0c; 请复查其设置 &#xff0c; 确保这些设置对于您的设计都正确无误 &#xff0c; 这一点至关重要。 Vivado IDE 中的比特流和器件镜像设置分为 2 种类型 &#xff1a; 1. 比特流或器件镜像文件格式设置。 2. 器件配置设置。 在 V…

翔云身份证实名认证接口-PHP调用方法

网络平台集成实名认证接口&#xff0c;是顺应当下网络实名制规定&#xff0c;有效规避法律风险。互联网平台若没有实名认证功能&#xff0c;那么便无法保证网民用户身份的真实性&#xff0c;很有可能被虚假用户攻击&#xff0c;特别是在当网络平台产生垃圾信息乃至是违法信息时…

大模型预测,下一个token何必是文字?

太快了太快了… 大模型的生成技能&#xff0c;已经到了普通人看不懂的境界&#xff01; 它可以根据用户过去5年的体检报告&#xff0c;生成未来第1年、第2年、第3年的体检报告。 你看&#xff0c;这个生成的过程&#xff0c;是不是像极了ChatGPT&#xff0c;根据历史单词预测…

JUC并发编程之常用方法

sleep() public void testSleepAndYield() {Thread t1 new Thread(() -> {try {log.debug("t1-sleep...");Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}}, "t1");log.debug("t1 start 前的状态&#…

机器学习 - 手动实现 ReLU 和 Sigmoid

直接上代码 import torch import matplotlib.pyplot as pltA torch.arange(-10, 10, 1, dtypetorch.float(32)) def relu(x):return torch.maximum(torch.tensor(0), x) plt.plot(relu(A))结果如下&#xff1a; import torch import matplotlib.pyplot as pltA torch.aran…

比 Python 快 9 万倍的 Mojo 终于开源了!

2024 年 3 月 29 日&#xff0c;Modular Inc. 宣布开源 Mojo 的核心组件。 Mojo 是一种专为编写人工智能软件设计的编程语言&#xff0c;去年 8 月份正式发布&#xff0c;迄今为止已经积累了超过 17.5 万名开发者和 5 万个组织。 人工智能模型通常使用多种编程语言编写。开发…