PostgreSql中的JSON数据类型

news2024/11/16 16:45:13

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.coloradmin.cn/o/1919665.html

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

相关文章

【Linux】日志

日志是记录软件运行过程中发生的事件的一种手段,通常包含以下内容: 时间戳:记录日志条目创建的确切时间。这对于追踪事件发生的时间顺序至关重要。日志级别:表示日志信息的严重性或重要性,常见的级别包括 DEBUG、INFO…

2024年西安铁一中集训DAY1---- 杂题选讲

文章目录 牛客练习赛125 E 联谊活动(枚举,分讨)牛客练习赛125 F 玻璃弹珠(类莫队,离线询问,数据结构)2024ccpc长春邀请赛 D Parallel Lines(随机化)2024ccpc长春邀请赛 E…

Java高级重点知识点-24-函数式接口

文章目录 函数式接口函数式编程常用函数式接口 函数式接口 有且仅有一个抽象方法的接口。 格式: 修饰符 interface 接口名称 {public abstract 返回值类型 方法名称(可选参数信息);// 其他非抽象方法内容 }public interface MyFunctionalInterface {void myMethod…

二进制补码计算

基本知识 原码(Sign and Magnitude):原码是一种最简单的表示法,使用符号位和数值位来表示整数。 符号位:最高位是符号位,0表示正数,1表示负数。 数值位:剩下的位表示数值的大小。反码&#xf…

2串锂电池5V升压15V 18V 2.5A 升压恒压IC H6391芯片 低待机功耗

H6391是一款升压恒压转换器芯片,适用于多种需要2.6-5V输入升压至较高电压的应用场景。但值得注意的是,在您提供的描述中提到输出可调达。 输出电压范围:H6391的直接输出电压可能无法直接达到15V或18V。 输出电流:H6391支持的可调…

Python类与对象01

1、理解使用对象完成数据组织的思路 1.1类和对象的基本理解 理解类:从现实世界到编程世界 类由三个部分组成:类名、类的属性、类的方法。类的定义实际上是描述事物的一种方法,在现实世界中,事物都是有属性和行为的。通过类&…

机器学习 | 对K-Means聚类假设的研究演示及实践示例

我们在Scikit-learn对K-means假设的调查中探索了揭示算法优势和局限性的场景。我们研究了K-means对不正确的聚类大小的敏感性,它在各向异性分布中面临的困难,它在不同的聚类方差中面临的困难,以及使用合成数据集的大小不均匀的聚类问题。我们…

2024.7.11作业

1.使用递归实现 求 n 的 k 次方 #include <stdio.h> int digui(int n,int k) { if(k0) //任何数的0次方等于1 { return 1; } else { return n*digui(n,k-1); //递归 } } int main(int argc,const char *argv[]) { in…

龙旗科技在线测评、招聘笔试 如何通过、考点分析|备考建议

龙旗电子入职在线测验真题考点分析&#xff0c;通过技巧&#xff1f; ​言语逻辑部分的考试时间是10分钟&#xff0c;需要完成10道题目。每题的作答时间被限定为60秒&#xff0c;一旦提交后无法返回修改。这部分的题目类型包括总结中心思想、选词填空和推理文章意思。考生需要快…

大模型真能模拟人类语言?中国人民大学提出新的数据增强方法

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读 论文标题:LLM-Generated Natural Language Meets Scaling Laws: New Explorations and Data Augmentation Methods 机构: School of Information Resource Management, Renmin University …

springboot定制化书籍销售系统-计算机毕业设计源码71193

摘要 随着电子商务的快速发展和图书市场的不断变革&#xff0c;定制化书籍销售系统的需求日益凸显。本文介绍了一种基于SpringBoot框架的定制化书籍销售系统的设计与实现。该系统旨在满足用户对于个性化、专业化的书籍需求&#xff0c;为用户提供高效、便捷的定制化购书体验。 …

C# HuaYun出口服务器

直连 串口转网口&#xff1a;通过请求帧写入波特率 或者地址位 或者温度 湿度等数据 读取时候 [0x01,0x03] 写入的时候[0x01&#xff0c;0x03] 写入波特率的时候请求帧 [0x01,0x06,0x07,0xD1,0x01,0x14] 把波特率改成0x01,0x14 namespace _01_HuaYun出口服务器 {public partia…

如何监控别人的聊天记录?三种监控聊天记录的方式,千万别让老板看见

监控别人的聊天记录&#xff0c;无论是出于父母对子女的关心、企业管理层对员工的监管&#xff0c;还是其他目的&#xff0c;都必须在法律许可的范围内进行&#xff0c;并且通常需要获得被监控者的明确同意。 非法监控他人的通信记录是严重侵犯隐私权的行为&#xff0c;违反了…

《昇思25天学习打卡营第18天|onereal》

RNN实现情感分类 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This film…

pdf压缩文件怎么压缩到小于10M或5m 且文件质量不影响画质清晰度

在数字化办公和学习中&#xff0c;pdf格式因其良好的兼容性和稳定性而受到广泛应用。然而&#xff0c;pdf文件体积较大时&#xff0c;会给我们带来传输和存储上的困扰。本文将为您介绍几种简单有效的方法&#xff0c;帮助您轻松压缩pdf文件&#xff0c;提高传输效率&#xff0c…

掉打面试官之Java的SPI机制理解

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【HMAC(ArkTS)】

HMAC(ArkTS) HMAC是密钥相关的哈希运算消息认证码&#xff08;Hash-based Message Authentication Code&#xff09;&#xff0c;是一种基于Hash函数和密钥进行消息认证的方法。 开发步骤 生成密钥 指定密钥别名。初始化密钥属性集。调用[generateKeyItem]生成密钥&#xf…

武夷山细节决定成败抓质量求生存

在当今竞争激烈的市场环境中&#xff0c;细节决定成败&#xff0c;质量求生存的理念已成为企业发展的关键。蓝鹏测控科技有限公司&#xff0c;一家专业从事工业测量领域的高新技术企业&#xff0c;正是秉持这一理念&#xff0c;在工业测径仪领域取得了显著成就。 蓝鹏测控科技…

tensorflow卷积层操作

全连接NN&#xff1a; 每个神经元与前后相邻层的每一个神经元都有全连接关系。输入是特征&#xff0c;输出为预测结果。 参数个数(前层*后层后层&#xff09; 实际应用时&#xff0c;会先对原始图像进行特征提取&#xff0c;再把提取到的特征送给全连接网络 会先进行若干层提…

复杂度(上卷)

前言 在正式进入今天的主题之前&#xff0c;我们不妨先来回顾一下初步学习数据结构后必须知道的概念。&#x1f3b6; 数据结构 数据结构是计算机存储、组织数据的方式&#xff0c;指相互间存在一种或多种特定关系的数据元素的集合。 &#xff08;没有一种单一的数据结构能够…