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

embedded/2024/11/21 23:22:49/

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

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

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

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

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

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

‌#>> 操作符‌:
类似于#>,但返回的是文本(字符串)值,而不是jsonjsonb类型的值。
如果索引超出数组的范围,返回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数据:

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;
通过组合使用这些操作符,你可以轻松地访问和操作存储在jsonjsonb列中的复杂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.ppmy.cn/embedded/139458.html

相关文章

MSTP知识点

多生成树协议 在 MSTP(Multiple Spanning Tree Protocol)中,根桥(root)、指定端口(designated port)、备用端口(alternate port)等角色都是确保网络中没有循环并且流量能…

探寻优质的 PostgreSQL 中级认证专家学习机构

PostgreSQL作为一种功能强大且高度可扩展的关系型数据库管理系统,正受到越来越多企业和开发者的青睐。如果你正在寻找一家优质的PostgreSQL中级认证专家学习机构,这篇文章将为你提供宝贵的指导和建议。 为什么选择PostgreSQL? PostgreSQL以其…

GLM4 PyTorch模型微调最佳实践

一 引言 2024年6月,智谱AI发布的GLM-4-9B系列开源模型,在语义、数学、推理、代码和知识等多方面的数据集测评中,GLM-4-9B和GLM-4-9B-Chat均表现出超越Llama-3-8B的卓越性能。并且,本代模型新增对26种语言的支持,涵盖日…

Vue跨域资源共享

在Vue前端开发中,跨域问题是一个常见的挑战,特别是当你需要从前端应用向不同域名或端口的后端API发送请求时。跨域请求通常会被浏览器的同源策略(Same-Origin Policy)阻止,以确保安全性。 以下是一些解决Vue前端跨域问…

5. langgraph中的react agent使用 (从零构建一个react agent)

1. 定义 Agent 状态 首先,我们需要定义 Agent 的状态,这包括 Agent 所持有的消息。 from typing import (Annotated,Sequence,TypedDict, ) from langchain_core.messages import BaseMessage from langgraph.graph.message import add_messagesclass …

【人工智能】用Python构建词向量模型:从零实现Word2Vec并探索FastText在低频词上的优势

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 词向量是自然语言处理中的关键技术之一,将词语转换为向量表示能够捕捉语义信息并应用于机器学习模型中。本文将介绍词向量的基本概念,通过从零实现Word2Vec模型帮助读者掌握词向量的生成过程。同时,本文…

【软件测试】设计测试用例的万能公式

文章目录 概念设计测试用例的万能公式常规思考逆向思维发散性思维万能公式水杯测试弱网测试如何进行弱网测试 安装卸载测试 概念 什么是测试用例? 测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包…

Redis性能优化——针对实习面试

目录 Redis性能优化什么是bigkey?bigkey的危害?如何处理bigkey?什么是hotkey?hotkey的危害?如何处理hotkey?如何处理大量key集中过期问题?什么是内存碎片?为什么会有Redis内存碎片?…