在PostgreSQL 16中怎样使用聚合函数处理JSONB数据?

胖敏大大_1563

胖敏大大_1563

2026-10-03

775人浏览

原创

应使用jsonb_agg或jsonb_object_agg聚合jsonb数据:前者生成数组,后者生成对象;二者均保持原始结构、类型及null语义,避免string_agg等文本拼接导致的解析失效与类型丢失。

在postgresql 16中怎样使用聚合函数处理jsonb数据?

直接用 jsonb_agg 或 jsonb_object_agg,别试图先转成 text 再拼接——会丢结构、类型、null 语义,且无法反向解析。

聚合 JSONB 数组:用 jsonb_agg,不是 string_agg

想把多行 JSONB 字段合并成一个 JSON 数组,必须用 jsonb_agg。它保持每个元素的原始 JSONB 类型和嵌套结构;而 string_agg 只输出字符串,再 cast 回 JSONB 会破坏引号、转义和 null 表示。

  • jsonb_agg(info) 正确:结果是 [{"name":"张三"}, {"name":"李四"}](合法 JSONB 数组)
  • string_agg(info::text, ',') 错误:结果是 {"name":"张三"},{"name":"李四"}(非法 JSON,缺外层 [])
  • 空输入时 jsonb_agg 返回 NULL,不是空数组 [];需要空数组请补 COALESCE(jsonb_agg(...), '[]'::jsonb)
  • 若被聚合字段本身为 NULL,该行会被跳过(符合 SQL 聚合惯例),不会插入 null 元素

按 key-value 聚合成 JSONB 对象:用 jsonb_object_agg

当有两列(如 key_col 和 val_col),想构造成 {"k1": "v1", "k2": "v2"} 这样的对象,jsonb_object_agg(key_col, val_col) 是唯一可靠方式。

Json Schema Toolkit
Json Schema Toolkit

使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。

下载
  • 键必须是 text 类型,非 text 会隐式 cast,但失败时直接报错(如 int 为 NULL 就炸)
  • 值可以是任意类型,自动转为 JSONB 表示:数值不变,NULL 变成 JSON null,布尔变 true/false
  • 重复 key 会保留最后一条,不报错也不警告
  • 不要用 jsonb_build_object 替代——它只接受固定参数个数,不能动态聚合多行

WHERE 或 GROUP BY 中过滤 JSONB 字段后再聚合,索引能生效

高频场景:统计满足某个 JSONB 条件的记录数,或聚合其字段。只要条件写法得当,GIN 索引可命中。

  • 推荐写法:WHERE info @> '{"status":"active"}' —— 使用 @> 操作符,配合 jsonb_path_ops 或 jsonb_ops GIN 索引
  • 避免写法:WHERE info->>'status' = 'active' —— 即使加了表达式索引,也常因类型转换或函数不可下推失效
  • 聚合前加 filter (where ...) 更清晰:jsonb_agg(info) FILTER (WHERE info @> '{"type":"user"}')
  • 如果聚合后还要查嵌套字段(如 jsonb_agg(...) #>> '{0,items,0,name}'),别指望索引加速——那是运行时计算

聚合结果再提取字段?小心嵌套层级和类型转换

jsonb_agg 输出是数组,jsonb_object_agg 输出是对象,后续用 -> / ->> 提取时,必须匹配结构。

  • 从聚合数组取第一个元素:(jsonb_agg(info))->0 —— 注意括号,否则运算符优先级导致错误
  • 提取后仍是 JSONB 类型,要文本值得再套 ->>:((jsonb_agg(info))->0)->>'name'
  • 如果不确定数组长度,用 jsonb_path_query_first 更安全:jsonb_path_query_first(jsonb_agg(info), '$[0].name')
  • 对空结果集聚合(如 WHERE false),jsonb_agg 返回 NULL,直接 -> 会得 NULL,不是错误——但 ->> 对 NULL 输入返回字符串 'null',WHERE 里易误判

最常被忽略的是聚合后的类型延续性:你拿到的永远是 JSONB,不是普通字段。所有后续操作都得按 JSONB 规则走,不能当成 text 或 varchar 去 LIKE 或 || 拼接,否则语义全乱。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json 聚合函数

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1995

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2842

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

976

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3199

7

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.10

213

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4249

19

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。更详细的postgresql常用命令,大家可以访问下面的文章。

2023.11.16

627

3

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有\l、\d、\d5、\di、\ds、\dv、\df、\dn、\db、\dg、\dp、\c、\pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

2023.11.20

1376

6

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2026.02.12

460

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.7万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习