Postgres操作jsonb数据

Postgres操作jsonb数据

PostgreSQL 对 jsonb 类型的筛选查询可以使用 -> 或者 ->> 操作符。
-> 操作符用于通过 JSON 对象中的键来获取对应的值。
->> 操作符可以将获取到的值转化为字符串类型。

1 查询

-- 数据准备
CREATE TABLE test (id SERIAL PRIMARY KEY,data JSONB
);INSERT INTO test (data) VALUES ('{"name": "John", "age": 30, "cities": ["New York", "Los Angeles"]}');
INSERT INTO test (data) 
VALUES ('{"name": "Jack", "age": 30, "address": {"city": "New York", "state": "NY"}}');
INSERT INTO test (data) 
VALUES ('{"name": "Jane", "age": 25, "address": {"city": "Los Angeles", "state": "CA"}, "phone": "123-456-7890"}');

1.1 WHERE data -> ‘name’ = ‘“John”’:查询name为John

-- 注意:键名需要用单引号括起来,并且键值需要用双引号括起来。
SELECT * FROM test WHERE data -> 'name' = '"John"';

1.2 WHERE data ->> ‘age’ = ‘30’:将整数转换为字符

-- 使用 ->> 将键对应的值转成字符串进行查询
SELECT * FROM test WHERE data ->> 'age' = '30';

1.3 WHERE data -> ‘cities’ @> ‘[“New York”,“Los Angeles”]’:查询数组

-- 上面的语句查询出 "cities" 数组中包含 "New York","Los Angeles" 元素的数据项。
-- @> 操作符表示包含。它用于检查 JSONB 数组是否包含给定元素。-- 如果要查询包含多个元素的数据项,可以在操作符两侧使用 AND 条件:
SELECT * FROM test WHERE data -> 'cities' @> '["New York","Los Angeles"]';-- 使用 ->> 将数组转化为字符串后进行查询
SELECT * FROM test WHERE data ->> 'cities' LIKE '%York%';
-- 上面的语句查询出 "cities" 数组中包含 "York" 子串的数据项。
-- 注意:这里使用了 LIKE 操作符,需要将数组先转换成字符串。-- 使用 ANY 操作符进行查询
SELECT * FROM test WHERE 'New York' = ANY(data -> 'cities');
-- 上面的语句查询出 "cities" 数组中包含 "New York" 元素的数据项。
-- 注意:ANY 操作符需要在数组左侧使用,并且等号(=)右边的值必须是一个数组元素的值。

1.4 WHERE data -> ‘address’ ->> ‘city’ = ‘New York’:多次解析查询

 
-- 根据 jsonb 字段中的嵌套对象的键值进行查询
SELECT * FROM test WHERE data -> 'address' ->> 'city' = 'New York';
-- 上面的语句查询出 "address" 对象中 "city" 键对应的值为 "New York" 的数据项。

1.5 WHERE data ? ‘phone’:查询json是否包含指定key

-- 使用 ? 操作符判断是否包含指定的键名
SELECT * FROM test WHERE data ? 'phone';
-- 上面的语句查询出包含 "phone" 键名的数据项。-- 使用 ?? 操作符模糊匹配键名
SELECT * FROM test WHERE data ?? 'address%';
-- 上面的语句查询出包含以 "address" 开头的键名的数据项。
-- 注意:?? 操作符支持通配符,在上例中 % 表示匹配任意字符。

1.6 WHERE data @> ‘{“age”: 30}’:查询是否包含指定k-v

-- 使用 @> 操作符判断是否包含指定的 JSON 对象
SELECT * FROM test WHERE data @> '{"age": 30}';
-- 上面的语句查询出包含 "age" 键为 30 的 JSON 对象的数据项。
-- 注意:@> 操作符表示包含。它用于检查 JSONB 是否包含给定对象。-- 使用 -> 和 #> 操作符结合起来查询更深层次的嵌套对象
SELECT * FROM test WHERE data -> 'address' #> '{state}' = 'NY';
-- 上面的语句查询出 "address" 对象中 "state" 键对应的值为 "NY" 的数据项。
-- #> 操作符用于获取一个路径表达式的键对应的值,返回的值可以是原始类型或者 JSONB 类型。

1.7 select data -> ‘cities’ -> 0 ->> ‘city1’ as city_name from test where id = 4;

json某个字段对应数组,查询出指定字段并另取别名

# 数据准备
INSERT INTO test (data) VALUES ('{"name": "Alisa", "age": 30, "cities": [{"city1":"New York", "city2":"Los Angeles"}]}');
# 从json字段中查询值并另取别名
select id, data -> 'cities' -> 0 ->> 'city1' as city_name from test where id = 4;

在这里插入图片描述

2 更新

2.1 set data = jsonb_set(data,‘{“age”}’,‘32’) where xx;更新age为32

在这里插入图片描述

# jsonb_set(需要更新的字段,更新的K,更新后V)
update test set data = jsonb_set(data,'{"age"}','32')
where id = 3;

3 删除

3.1 set data = data - ‘age’ where xx:删除json的age字段

在这里插入图片描述

# 删除json结构中的age字段
update test set data = data - 'age' where id = 3;

4 新增

4.1 set data = jsonb_set(data, ‘{“hobbies”}’,‘“soccer”’) where xx;添加hobbies字段

在这里插入图片描述

update test set data = jsonb_set(data, '{"hobbies"}','"soccer"') where id = 2;

参考文章:https://blog.csdn.net/Yuuuuuubs/article/details/131307500

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

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

相关文章

windows下的私钥权限管理

被问到Windows的私钥是否可以共享给多个用户,我们知道CNG创建的私钥,压根就没有提供跨用户和组的机制,因此无论对称还是非对称,CNG中的私钥没办法在用户间共享。 Windows支持的SACL中的访问客体,也不包括密钥。 但是…

Vulnhub靶机:driftingblues 6

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:driftingblues6(10.0.2.22) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entr…

服务拆分及远程调用

分布式架构都离不开服务的拆分,微服务也是一样。 1.微服务拆分 不同微服务,不要重复开发相同业务 微服务数据独立,不要访问其它微服务的数据库 微服务可以将自己的业务暴露为接口,供其它微服务调用 2.远程调用 以前时&#xf…

如何在Linux中使用~/.bashrc配置Java环境变量

为什么使用 ~/.bashrc 而不是 ~/.profile 原因 ~/.bashrc和~/.profile(或在某些系统中是~/.bash_profile或~/.bash_login)是用来配置用户的shell环境的两个不同的文件。它们的主要区别在于它们被加载的时机和适用的场合: ~/.bashrc主要用于…

1 python计算机基础

计算机基础和环境搭建 1 计算机基础和环境搭建1.计算机基础1.1 基本概念1.2 编程语言1.3 编译器/解释器 2.学习编程的本质3.Python的介绍3.1 语言的分类3.2 Python3.3 Python的解释器种类(了解)3.4 CPython解释器的版本 4.环境搭建4.1 安装Python解释器4…

关于C#中Monitor的wait/pulse的理解

wait:表示释放对象上的锁并阻止当前线程,直到它重新获取该锁。 pulse:表示通知等待队列中的线程锁定对象状态的更改。 当线程调用 Wait 时,它会释放对象上的锁并进入对象的等待队列。 对象的就绪队列中的下一个线程 (如果有一个…

Matlab交互式的局部放大图

在数据可视化中,很多时候需要对某一区间的数据进行局部放大,以获得对比度更高的可视化效果。下面利用 MATLAB 语言实现一个交互式的局部放大图绘制。 源码自行下载: 链接:https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd9d…

《2023年度程序员收入报告》 :旧金山位居第一,北京程序员中位数超60万元

2024年刚刚拉开序幕,备受瞩目的程序员薪资调研报告再度登场。由知名数据采集平台levels.fyi 搜集并整理了《2023年全球程序员收入报告》,为我们揭示了程序员最新的收入情况,其中有哪些值得关注的亮点呢? 行情向好,大多…

burp靶场——XXE注入

XML 外部实体 (XXE) 注入 1. 什么是xxe漏洞: https://portswigger.net/web-security/xxe#what-is-xml-external-entity-injection XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。…

GEE:机器学习分类中每个类别的概率图像可视化

作者:CSDN @ _养乐多_ 在 Google Earth Engine(GEE) 中应用机器学习分类器进行多分类时,有一个需求是想知道每个像素对于每个类别的分类概率。 比如在进行随机森林分类时,每个决策树会生成一个类别,通过投票选择票数最多的类别作为最终分类。除了最终分类结果,其他类别…

Pandas.DataFrame.groupby() 数据分组(数据透视、分类汇总) 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本: 本文基于 pandas2.1.2 编写。 关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。 Pandas稳定版更新及变动内容整合专题: Pandas稳定版更新及变动迭持续更新。 Pandas API参…

计算机组成原理 运输层

文章目录 运输层运输层协议概述进程之间的通信运输层的两个主要协议运输层的端口 用户数据报协议 UDPUDP 概述UDP 的首部格式 传输控制协议 TCP 概述TCP 最主要的特点TCP 的连接 可靠传输的工作原理停止等待协议连续 ARQ协议 TCP 报文段的首部格式TCP 可靠传输的实现以字节为单…

TensorRT模型优化部署 (八)--模型剪枝Pruning

系列文章目录 第一章 TensorRT优化部署(一)–TensorRT和ONNX基础 第二章 TensorRT优化部署(二)–剖析ONNX架构 第三章 TensorRT优化部署(三)–ONNX注册算子 第四章 TensorRT模型优化部署(四&am…

Go-安装与基础语法

TOC 1. Go 安装与环境变量 1.1 下载 需要从Go语言的官方网站下载适合你操作系统的Go语言安装包。Go语言支持多种操作系统,包括Windows、Linux和Mac OS。 对于Windows用户,下载.msi文件,然后双击该文件,按照提示进行安装即可。…

python的装饰器详解

目录 一:介绍 二:在方法中使用 三:在类中使用 四:python自带的装饰器 一:介绍 Python的装饰器是一种高阶函数,它允许你在不改变函数内部逻辑的情况下,给函数添加额外的功能。装饰器本质上是…

剖析setinterval用法

1 基本语法 JavaScript:setInterval() 用法详解_js setinterval-CSDN博客 setInterval() 是 JavaScript 中的一个内置函数,它用于在指定的间隔时间内重复执行一段代码,实现周期性操作。该函数的语法如下: setInterval(function…

2024年浙江省高新技术企业申报的条件和各地区的奖励补贴

浙江省高新技术企业奖励补贴 1、舟山市高新技术企业奖励 对新认定的国家高新技术企业,每家给予20万元奖励。 定海区 对新认定的高新技术企业,一次性给予30万元的专项补助;对有效期内的高新技术企业在工业企业绩效评价中可给予提档。 普陀…

【C++进阶】心心念念的红黑树,它来了!

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

Spring框架是如何解决Bean创建过程中的循环依赖问题的

引言 本文主要梳理了Spring框架Bean创建过程中应对循环依赖问题的相关源码。我在手写super-mini-webpackhttps://blog.csdn.net/q1424966670/article/details/135628531?spm1001.2014.3001.5502的时候也介绍过解决循环依赖的算法:Map记忆化搜索。可以猜测这段源码…