PostgreSQL JSON/JSONB 查询与操作指南

news/2024/12/16 3:26:35/

PostgreSQL 提供了强大的 JSONJSONB 数据类型及相关操作,适用于存储和查询半结构化数据。本文将详细介绍其常用操作。


1. 基础操作

1.1 JSON 属性访问

  • ->: 返回 JSON 对象中的值,结果为 JSON 格式。
SELECT '{"a": {"b": 1}}'::jsonb -> 'a';
-- 返回:{"b": 1}
  • ->>: 返回 JSON 对象中的值,结果为文本。
SELECT '{"a": {"b": 1}}'::jsonb -> 'a' ->> 'b';
-- 返回:"1" (文本)

1.2 JSON 数组访问

  • 索引访问数组元素
SELECT '[1, 2, 3]'::jsonb -> 1;
-- 返回:2 (JSON 格式)
  • 获取数组中某元素的文本
SELECT '[1, 2, 3]'::jsonb ->> 1;
-- 返回:"2" (文本)

2. 高级操作

2.1 查询嵌套 JSON 的值

  • 使用 #> 获取嵌套对象:
SELECT '{"a": {"b": {"c": 3}}}'::jsonb #> '{a,b}';
-- 返回:{"c": 3}
  • 使用 #>> 获取嵌套对象的文本值:
SELECT '{"a": {"b": {"c": 3}}}'::jsonb #>> '{a,b,c}';
-- 返回:"3" (文本)

2.2 条件查询

通过字段筛选数据
SELECT *
FROM example_table
WHERE jsonb_column ->> 'key' = 'value';
判断是否包含特定键值对
SELECT *
FROM example_table
WHERE jsonb_column @> '{"key": "value"}';
判断是否包含特定键
SELECT *
FROM example_table
WHERE jsonb_column ? 'key';
判断是否包含多个键
  • 任意一个键
SELECT *
FROM example_table
WHERE jsonb_column ?| array['key1', 'key2'];
  • 所有键
SELECT *
FROM example_table
WHERE jsonb_column ?& array['key1', 'key2'];

2.3 数组操作

判断数组是否包含元素
SELECT *
FROM example_table
WHERE jsonb_column @> '[1, 2]'; -- JSON 数组包含 [1, 2]
判断数组是否重叠
SELECT *
FROM example_table
WHERE jsonb_column ?| array['key1', 'key2'];

3. 修改 JSON 数据

3.1 添加键值

UPDATE example_table
SET jsonb_column = jsonb_column || '{"new_key": "new_value"}';

3.2 删除键

  • 删除单个键
UPDATE example_table
SET jsonb_column = jsonb_column - 'key_to_remove';
  • 删除多个键
UPDATE example_table
SET jsonb_column = jsonb_column - '{key1, key2}';

3.3 替换嵌套值

  • 使用 jsonb_set 替换嵌套值:
UPDATE example_table
SET jsonb_column = jsonb_set(jsonb_column, '{nested,key}', '"new_value"');

4. 聚合操作

4.1 提取 JSON 中的字段值

SELECT jsonb_column ->> 'key', COUNT(*)
FROM example_table
GROUP BY jsonb_column ->> 'key';

4.2 将多个 JSON 合并

SELECT jsonb_agg(jsonb_column)
FROM example_table;

4.3 展开 JSON 数组

SELECT jsonb_array_elements(jsonb_column)
FROM example_table;

5. 索引优化

5.1 创建 JSONB 索引

创建 GIN 索引
CREATE INDEX idx_jsonb_column ON example_table USING gin (jsonb_column);
使用 JSONB 索引进行快速查询
SELECT *
FROM example_table
WHERE jsonb_column @> '{"key": "value"}';
创建键路径索引
CREATE INDEX idx_jsonb_key ON example_table USING gin ((jsonb_column -> 'key'));

PostgreSQL 的 JSONB 查询功能强大且灵活,适合各种复杂的数据处理场景。结合索引优化,性能可以进一步提升。


http://www.ppmy.cn/news/1555481.html

相关文章

如何在服务器上安装 Maven

1. 安装Java Development Kit (JDK) 由于Maven依赖于Java运行环境,因此首先需要确保系统中已经安装了合适的JDK版本。 通过以下命令检查Java版本, java -version如果未安装JDK可以参考如何在服务器上安装 Java OpenJDK相关文档来安装特定版本的JDK。 …

HOW - PPT 制作系列(四)- 实践和技巧

目录 一、神器与技巧二、色彩的搭配三、图片的处理四、形状与图标五、字体的处理六、图表的制作七、总结/制作思维八、如何精简 ppt 内容我们 PPT 制作系列在之前已经介绍过: HOW - PPT 制作系列(一)- 一页ppt里要注意什么HOW - PPT 制作系列(二)- 三大技能HOW - PPT 制作…

魅族手机刷官方系统

从魅族官网下载固件 https://flyme.cn/firmware.html 找到自己的型号,里面有历史版本、最新版,按照需求下载。 下载的是update.zip,改名就不能升级了 方法1 直接点击下载的update.zip包就可以升级。 方法2 将文件移动到文件管理的根目录&a…

git commit提交时报错running pre-commit hook:lint-staged

背景描述 在提交代码时 突然报错running pre-commit hook:lint-staged 下方则有报错文件及因为什么报错的提示 解决方式 最简单粗暴的解决方式就是在项目文件夹中的.git文件内的hooks文件夹中pre-commit删除掉 进行不检测提交或者直接强制提交--no-verify 但源头其实是因为…

华纳云:哪些行业会用到大硬盘存储服务器?

大硬盘存储服务器被广泛应用于需要大量数据存储、处理和管理的多个领域。以下是一些典型的应用场景: 1. 数据中心和云计算:数据中心需要为各种服务提供后端支持,包括云存储、虚拟化、数据库管理和备份恢复等。大数据硬盘服务器能够提供必要的…

智能家居与AI物联网的无缝连接:构建个性化、智能化的居住体验

智能家居与AI物联网的无缝连接:构建个性化、智能化的居住体验 引言 智能家居(Smart Home)和人工智能(AI)技术的发展,正在重塑我们的家庭生活。通过将智能家居设备与AI物联网(IoT)进…

电子电气架构 --- 智能座舱升级驱动

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…