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数据:

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对象

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

文本对象

bash 复制代码
select jsonb_array_elements_text(info->'phone_numbers');
输出:
123-456-7890
098-765-4321
bash 复制代码
select jsonb_array_element_text(info->'phone_numbers', 0);
输出:
123-456-7890
相关推荐
西哥写代码6 小时前
基于dcmtk的dicom工具 第九章 以json文件或sqlite为数据源的worklist服务(附工程源码)
sqlite·json·mfc·dcmtk·worklist
Jantor10 小时前
PostgreSQL 分区最佳实践
数据库·postgresql
booleandev11 小时前
PostgreSQL 分区最佳实践
postgresql
Mu.38712 小时前
JSON解析
json
勤匠15 小时前
在CentOS上以源码编译的方式安装PostgreSQL
linux·postgresql·centos
我今晚不熬夜15 小时前
JSON在java中的使用
java·开发语言·json
····懂···16 小时前
开源数据库PostgreSQL专家技术
数据库·postgresql·开源
duration~1 天前
PostgreSQL并发控制
数据库·postgresql
铭哥的编程日记1 天前
《C++ list 完全指南:从基础到高效使用》
开发语言·c++·list
希克厉1 天前
PostgreSql基础
postgresql