当前位置: 首页 > news >正文

PostgreSQL提取JSON格式的数据(包含提取list指定索引数据)

PostgreSQL提取JSON格式的数据(包含提取list指定索引数据)

->>, ->, #>, #>>

在PostgreSQL中,处理json或jsonb类型数据时,->>, ->, #> 和 #>> 是非常有用的操作符,它们允许你以不同的方式访问JSON对象或数组中的元素。以下是这些操作符的详细解释:

‌->> 操作符‌:
从JSON对象中提取文本(字符串)值。
如果指定的键不存在,返回NULL。
示例:json_col->>‘name’ 从json_col列中提取名为name的键对应的文本值。

‌-> 操作符‌:
从JSON对象中提取json或jsonb类型的值(即另一个JSON对象或数组)。
如果指定的键不存在,返回NULL,但返回值的类型仍然是json或jsonb
示例:json_col->‘address’ 从json_col列中提取名为address的键对应的jsonb对象。

‌#> 操作符‌:
用于访问JSON数组中的元素,其中跟随的是数组的索引(从0开始,遵循JSON的索引习惯)。
如果索引超出数组的范围,返回NULL。
返回的是json或jsonb类型的值,具体取决于你的列类型。
示例:json_col#>‘{phones,1}’ 从json_col列中名为phones的数组中提取索引为1的元素(注意这是第二个元素,因为索引从0开始)。

‌#>> 操作符‌:
类似于#>,但返回的是文本(字符串)值,而不是json或jsonb类型的值。
如果索引超出数组的范围,返回NULL。
示例:json_col#>>‘{phones,0}’ 从json_col列中名为phones的数组中提取索引为0的元素,并返回其文本表示。

重要提示‌:
->> 和 -> 主要用于访问JSON对象的顶层或嵌套元素。要访问更深层次的嵌套元素,你可能需要组合使用这些操作符。
#> 和 #>> 主要用于访问JSON数组中的元素。要访问整个数组或进行更复杂的查询,你可能需要结合其他函数或操作符。
在使用这些操作符时,请确保你的JSON数据是有效的,并且你正在访问的键或索引确实存在于JSON数据中。

如果你的字段是文本类型,需要转换为jsonb或者json类型,并且确保你的字段值都是有效的json字符串,否则会报错。
判断是否是有效的json格式的字符串:
https://blog.csdn.net/weixin_42949219/article/details/139988773

综合示例‌:

假设我们有一个名为users的表,它有一个jsonb类型的列info,其中包含以下JSON数据:

Copy Code
{"id": 1,"name": "John Doe","email": "john.doe@example.com","preferences": {"notifications": true,"language": "en"},"phone_numbers": ["123-456-7890", "098-765-4321"]
}

我们可以使用上述操作符来访问这个JSON数据中的不同元素:
获取用户的姓名(文本):SELECT info->>‘name’ FROM users;
获取用户的偏好设置(jsonb对象):SELECT info->‘preferences’ FROM users;
获取用户是否启用通知(布尔值,作为文本):SELECT info->‘preferences’->>‘notifications’ FROM users;
获取用户的第一个电话号码(文本):SELECT info#>>‘{phone_numbers,0}’ FROM users;
通过组合使用这些操作符,你可以轻松地访问和操作存储在json或jsonb列中的复杂JSON数据。

拓展函数:
jsonb对象

select jsonb_array_elements(info->'phone_numbers');
输出:
"123-456-7890"
"098-765-4321"
select jsonb_array_element(info->'phone_numbers', 0);
输出:
"123-456-7890"

文本对象

select jsonb_array_elements_text(info->'phone_numbers');
输出:
123-456-7890
098-765-4321
select jsonb_array_element_text(info->'phone_numbers', 0);
输出:
123-456-7890
http://www.lryc.cn/news/488302.html

相关文章:

  • 如何利用谷歌浏览器提高网络安全
  • go-zero(四) 错误处理(统一响应信息)
  • 1.1 爬虫的一些知识(大模型提供语料)
  • Linux开发工具:Vim 与 gcc,打造高效编程的魔法双剑
  • cesium for unity的使用
  • Android AOSP 架构和各层次开发内容介绍
  • Kafka 到 Kafka 数据同步
  • 华为刷题笔记--题目索引
  • osgEarth加载倾斜摄影测量数据
  • 消息推送问题梳理-团队管理
  • 如何在 Ubuntu 上使用 Docker 部署 LibreOffice Online
  • MongoDB数据备份与恢复(内含工具下载、数据处理以及常见问题解决方法)
  • 代码随想录第三十一天| 56. 合并区间 738.单调递增的数字
  • C语言基本知识 2.2void 函数
  • Spring 框架中哪些接口可以创建对象
  • 豆瓣书摘 | 爬虫 | Python
  • Oracle数据库物理存储结构管理
  • java——Map接口
  • 量子计算机全面解析:技术、应用与未来
  • IDEA相关(包括但不限于快捷键,使用技巧)成长笔记
  • 【再谈设计模式】适配器模式 ~接口兼容的桥梁
  • 使用Cursor和Claude AI打造你的第一个App
  • 粗读Apache Paimon 的基本概念及其组成结构
  • c++调用 c# dll 通过 P/Invoke (详细避坑)
  • 李春葆《数据结构》——图相关代码
  • Linux驱动开发第2步_“物理内存”和“虚拟内存”的映射
  • 告别多品牌乱战,吉利开始觉醒
  • Target-absent Human Attention
  • <QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全
  • 通过huggingface-cli下载Hugging Face上的公开数据集或模型至本地