PostgreSql中的JSON数据类型

PostgreSQL 提供了两种 JSON 数据类型:JSON 以及 JSONB。这两种类型主要的区别在于数据存储格式,JSONB 使用二进制格式存储数据,更易于处理。

PostgreSQL 推荐优先选择 JSONB 数据类型。

两种数据类型之间的区别:

功能JSONJSONB
存储格式字符串原文存储解析后的二进制
全文索引不支持支持
保留空白符保留不保留
保留键的顺序保留不保留
保留重复键保留不保留

由于存储格式的不同,JSONB 输入时稍微慢一些(需要转换),但是查询时快很多。

接下来的内容主要使用 JSONB 数据类型,但是大部分功能也可以使用 JSON 数据类型。

一、创建并插入数据

CREATE TABLE product (id INTEGER NOT NULL PRIMARY KEY,name VARCHAR(100),attr1 JSONB,attr2 JSON
);

1. 插入数据:

INSERT INTO product
VALUES( 1, '阿莫西林', '{"code": "100011","price": 18,"uom": "盒","specification": "10粒/盒","price": 18.00}','{"code": "100011","price": 18,"uom": "盒","specification": "10粒/盒","price": 18.00}');INSERT INTO product
VALUES( 2, '阿司匹林', '{"code": "100013","price": 28,"uom": "盒","specification": "20粒/盒","price": 28.00}','{"code": "100013","price": 28,"uom": "盒","specification": "20粒/盒","price": 28.00}');

 2. 查询数据:

从红框中内容可以看出来两种类型的区别:JSON保留原格式,JSONB不做保留,具体见上边的表格。

3. 格式化方法插入:

jsonb_build_object、json_build_object 函数可以通过一系列输入创建JSON 对象

	
INSERT INTO product
VALUES( 3, '农夫山泉', jsonb_build_object ( 'code', '100015', 'price', 3 ), json_build_object ( 'code', '100015', 'price', 3 ) );

其他常用的构建 JSON 数据的函数如下:

  • to_json 以及 to_jsonb

  • array_to_json

  • row_to_json

  • json_build_array 以及 jsonb_build_array

  • json_object 以及 jsonb_object

具体操作可以参考:PostgreSQL操作json/jsonb方法详解_PostgreSQL_脚本之家

这些方法看完还是觉得直接输入来的简单方便,也可能我没有领略到精髓。

二、查询JSON字段及属性(下边都以JSONB的格式)

 1. 查询JSON字段:

product=# select * from product where id =3 ;id |   name   |             attr1              |              attr2
----+----------+--------------------------------+----------------------------------3 | 农夫山泉 | {"code": "100015", "price": 3} | {"code" : "100015", "price" : 3}
(1 row)product=# select name, attr1, attr2 from product where id =3 ;name   |             attr1              |              attr2
----------+--------------------------------+----------------------------------农夫山泉 | {"code": "100015", "price": 3} | {"code" : "100015", "price" : 3}
(1 row)

2. 获取JSON单个属性

查询attr1下的code属性,

运算符 -> 可以通过指定节点的键获取相应的数据。这种方法返回的数据仍然是 JSON 类型,使用双引号包含。

如果想要以字符串形式返回节点中的数据值,可以使用运算符 ->>。如:

如果查询的 JSON 节点不存在,将会返回空值:

3. 获取JSON数组属性

第二个 -> 运算符返回了该属性中的第 1 个数组元素(数组下标从 0 开始)。

注意这里第一个不能使用“ ->>”,转成字符串之后就没法再往下获取元素了。

运算符 #> 以及 #>> 可以通过指定 JSON 节点的路径获取嵌套属性,路径可以包含键的名称或者数组元素下标,返回类型分别为 JSON 和字符串。

4. 基于JSON数据的过滤

直接以属性作为条件进行查询:这种无法根据属性进行匹配,

 如果要匹配就需要用以下方式:

需要注意的是->是json格式,-->是字符,需要注意匹配,如元素属性为数字,则需要转换后对比:

5. JSON 转换为数据行

PostgreSQL 支持将 JSON 字段转换为数据行格式。例如,jsonb_each 函数可以将每个键值对转换为一个记录:

与此类似的函数还有:

  • json_each 以及 json_each_text

  • json_array_elements 以及 json_array_elements_text

  • jsonb_array_elements 以及 jsonb_array_elements_text

6. 获取所有JSON的key

7. 判断JSON属性是否存在

PostgreSQL 还提供了一些用于判断 JSON 属性是否存在的运算符,例如 ? 运算符。

三、更新 JSON 字段数据

1. || 运算符

使用 UPDATE 语句更新 JSON 字段时,可以通过 || 运算符将新的键值增加到已有 JSON 数据。例如:

JSONB格式没有顺序

2. jsonb_insert 方法

利用 jsonb_insert 方法,例如:

3. jsonb_set 方法

如果想要更新已有键的数值,可以使用 jsonb_set 函数。例如:

如果没有key则新增:

 

四、删除 JSON 字段数据

1. 删除整个 JSON 字段数据可以简单地将其设置为 NULL,例如:

2. 删除 JSON 字段中的某个属性可以使用 - 运算符,例如:

当没有元素属性时,不会删除报错。

五、全文索引

PostgreSQL 提供了支持 JSON 字段的全文索引,可以优化查询的性能。这种索引的类型为 GIN(通用倒排索引),通常用于搜索引擎。

 CREATE INDEX index_product_att1 ON product USING GIN(attr1);

attr1时JSONB类型,而atttr2是JSON类型,创建索引会报错,这个差异对应了上边表格

以上基本是暂时了解到的内容,欢迎交流斧正!!!

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

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

相关文章

网络建设与运维23国赛网络运维正式赛题解析

竞赛环境请看主页! 23国赛网络运维 任务描述:某集团公司在更新设备后,路由之间无法正常通信,请修 复网络达到正常通信。 (1) 请在server1“管理员”下拉菜单中选择“镜像”选项卡,点 击 “创…

超声波眼镜清洗机有用吗?四大主流超声波清洗机品牌整理测评

长期佩戴的眼镜,若不定期清洗,不仅镜片会逐渐积聚油脂、灰尘,影响透光率,使视物模糊,更严重的是,眼镜上日益增加的微小杂质和细菌可能会逐渐影响到眼睛健康,导致视力下降、眼部疾病等问题。 这…

Go 1.19.4 函数-Day 08

1. 函数概念和调用原理 1.1 基本介绍 函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。 函数声明告诉了编译器函数的名称,返回类型,和参…

STM32 - PWR 笔记

PWR(Power Control)电源控制 PWR 负责管理 STM32 内部的电源供电部分,可以实现 可编程电压监测器 和 低功耗模式 的功能 可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD…

usbserver工程师手记(三)手工开通 OTP功能

1、设定密钥,用户自行选择一个密钥,以下以密钥为 EAZAYOKNGETBOPC5 为例说明 2、usb server 配置otp 密钥,目前还没有UI 界面开通,后续版本会支持从管理界面开通 curl -X POST -H Content-Type: application/json -H Accept: app…

Centos7下zabbix安装与部署

Centos7下zabbix安装与部署 一、Zabbix介绍 1、zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 2、zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各…

活动策划秘籍:如何让企业活动引爆市场?

作为一个活动策划,我的经验是,活动策划是一场精心编排的交响乐,每一个音符都要恰到好处。 想要做好企业活动策划工作的关键在于综合考虑多个方面,并确保每个环节的顺畅执行。 以下是7个关键要素,只要用心体会&#x…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥派生(C/C++)】

密钥派生(C/C) 以HKDF256密钥为例,完成密钥派生。具体的场景介绍及支持的算法规格,请参考[密钥生成支持的算法]。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 生成密钥 指定密钥别名。 初始化密钥属…

通过电压差判定无源晶振是否起振正确吗?

在电子工程中,无源晶振作为许多数字电路的基础组件,其是否成功起振对于系统的正常运行至关重要。然而,通过简单检测晶振两端的电压差来判断晶振是否工作,这一方法存在一定的误区,晶发电子将深入探讨这一话题&#xff0…

2008年下半年软件设计师【下午题】真题及答案

文章目录 2008年下半年软件设计师下午题--真题2008年下半年软件设计师下午题--答案 2008年下半年软件设计师下午题–真题 2008年下半年软件设计师下午题–答案

四川赤橙宏海商务信息咨询有限公司抖音电商服务靠谱吗?

在数字化浪潮席卷全球的今天,电商行业蓬勃发展,各种新兴电商平台层出不穷。其中,抖音电商以其独特的社交属性和庞大的用户基础,迅速崛起为行业新星。四川赤橙宏海商务信息咨询有限公司,作为专注于抖音电商服务的佼佼者…

个人怎么交易现货黄金:加速形态

我们作为普通个人,在现货黄金市场中交易就需要掌握相应的现货黄金投资技巧。下面我们就来介绍一个,个人怎么交易现货黄金的形态——加速形态。 加速形态是用于判断市场趋势力竭的情况,这种趋势可以是上升,也可以是下跌。但是要注意…

用Qwt进行图表和数据可视化开发

目录 Qwt介绍 示例应用场景 典型QWT开发流程 举一些Qwt的例子,多绘制几种类型的图像 1. 绘制折线图 (Line Plot) 2. 绘制散点图 (Scatter Plot) 3. 绘制柱状图 (Bar Plot) 4. 绘制直方图 (Histogram) Qwt介绍 QWT开发主要涉及使用QWT库进行图表和数据可视化…

晋升业内新宠儿,MoE模型给了AI行业两条关键出路

文 | 智能相对论 作者 | 陈泊丞 今年以来,MoE模型成了AI行业的新宠儿。 一方面,越来越多的厂商在自家的闭源模型上采用了MoE架构。在海外,OpenAI的GPT-4、谷歌的Gemini、Mistral AI的Mistral、xAI的Grok-1等主流大模型都采用了MoE架构。 …

第三方配件也能适配苹果了,iOS 18与iPadOS 18将支持快速配对

苹果公司以其对用户体验的不懈追求和对创新技术的不断探索而闻名。随着iOS 18和iPadOS 18的发布,苹果再次证明了其在移动操作系统领域的领先地位。 最新系统版本中的一项引人注目的功能,便是对蓝牙和Wi-Fi配件的配对方式进行了重大改进,不仅…

python如何计算两个时间相差多少秒钟,分钟,小时,天,月,年

使用场景:在做上课记录系统的时候,有上课开始时间和上课结束时间,需要计算这两个时间的插值,以分钟为单位。 封装方法如下: from datetime import datetimedef sub_seconds(date1: str "2024-07-11 12:33:33&q…

【CORS 报错】跨域请求问题:CORS 多种环境下的解决方案

🔥 个人主页:空白诗 文章目录 一、CORS错误的常见原因二、解决方案1. Vue3 Vite项目下的解决方案创建Vue3 Vite项目配置Vite的代理发送请求 2. jQuery项目下的解决方案使用CORS请求头使用JSONP 3. 其他环境下的解决方案使用服务器端代理设置CORS头使用…

PS拉框选择工具

Photoshop(PS)中的拉框选择工具,也称为选框工具,是图像处理中非常基础且强大的工具之一。它允许用户通过绘制矩形、椭圆形以及单行、单列的选择框来选定图像中的特定区域。本教程将详细介绍选框工具的使用方法、技巧及其属性设置。…

前端vue3 登录页面 响应式开发

一个登录页面 我直接上代码了 结构是这样的 Login 页面 <template><a-layout class"login-box"><a-layout-content class"login-content"><a-row align"middle" justify"center" class"login-content-ma…

蝙蝠避障:为盲人出行插上科技的翅膀

在这个五彩斑斓的世界里&#xff0c;每一步都充满了探索与惊喜。但对于我这样的视障者来说&#xff0c;每一次出行都是一场未知的冒险。我时常面临着难以想象的挑战&#xff1a;如何安全地穿越繁忙的街道&#xff0c;怎样准确地识别前方的障碍物&#xff0c;乃至简单地找到回家…