如何在SQL Server中使用GROUP BY对JSON数组聚合

夜雪姑娘_6563

夜雪姑娘_6563

2026-10-02

177人浏览

原创

sql server 无原生json_arrayagg函数,须用子查询+for json实现数组聚合,如select dept_name, (select name,role from emp where dept_id=d.id for json auto) as staff_json from dept d group by d.id,dept_name。

如何在sql server中使用group by对json数组聚合

SQL Server 不存在 JSON_ARRAYAGG 函数,直接写 JSON_ARRAYAGG 会报错“对象名 'JSON_ARRAYAGG' 无效”。你必须用 FOR JSON 配合子查询 + GROUP BY 实现等效效果,或改用 STRING_AGG 拼接后手动包 JSON 结构(不推荐)。

SQL Server 2016+ 正确做法:用 FOR JSON 在子查询中展开再聚合

SQL Server 不支持原生数组聚合函数,FOR JSON 是唯一可靠路径。它本质是把每组结果转成 JSON 数组字符串,不是生成真正的 JSON 类型值(注意类型是 NVARCHAR(MAX),不是 JSON)。

常见错误是试图在主查询里直接 SELECT ... FOR JSON 而没嵌套子查询,导致语法报错或结果错乱。

  • 必须用子查询包裹分组逻辑,外层再加 FOR JSON;例如统计每个部门的员工列表:
  • SELECT d.dept_name, (SELECT e.name, e.role FROM employees e WHERE e.dept_id = d.id FOR JSON AUTO) AS staff_json FROM departments d GROUP BY d.id, d.dept_name;
  • FOR JSON AUTO 自动推导结构,但字段名不能含点号(如 e.name 可,e.contact.email 不行);需显式别名:e.contact_email AS [contact.email]
  • 空组返回 NULL,不是空数组 [];若需强制返回空数组,得用 ISNULL(..., '[]') 包裹子查询
  • 子查询里不能用 ORDER BY(除非加 TOP 100 PERCENT),否则 FOR JSON 报错

为什么不用 OPENJSON 做聚合?

OPENJSON 是解析函数,不是聚合函数。它把 JSON 字符串“展开”成行,适合反向操作(比如把 JSON 数组炸开后做 GROUP BY),但无法把多行聚合成一个 JSON 数组。

Json Schema Toolkit
Json Schema Toolkit

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

下载

典型误用:SELECT JSON_VALUE(items, '$[0].id') FROM orders GROUP BY items —— 这只是取首元素,不是聚合。

  • 想对 JSON 数组字段(如 orders.items)做统计,先用 OPENJSON(items) 展开,再 GROUP BY 原表主键,最后在外层用 FOR JSON 封装结果
  • 漏掉 WITH 子句时,OPENJSON 返回 key/value/type 三列,无法直接聚合数值字段;必须写明路径:WITH (item_id INT '$.id', qty INT '$.qty')
  • OPENJSON 不自动验证 JSON 合法性;若字段含非法 JSON,查询直接报错,建议前置 ISJSON(items) = 1 过滤

SQL Server 2022+ 的新选项:JSON_OBJECTAGG 只适用于键值对,不适用于数组

JSON_OBJECTAGG 是 SQL Server 2022 引入的,但它只接受两个参数(key 和 value),输出是 JSON 对象 {"k1":"v1","k2":"v2"},**不能生成数组 [...]**。

如果你的数据天然是键值结构(如配置项 {"timeout":30,"retries":3}),可以用它;但面对订单明细这种数组结构,它完全不适用。

  • 错误尝试:SELECT JSON_OBJECTAGG('id', item_id) FROM OPENJSON(...) WITH (item_id INT '$.id') → 返回对象,不是数组
  • 强行模拟数组:用 STRING_AGG 拼 '[' + STRING_AGG(...) + ']',但需手动转义引号、处理 NULL、兼容中文——极易出错,生产环境不建议
  • 真正需要数组语义时,坚持用子查询 + FOR JSON AUTO 或 FOR JSON PATH,后者控制力更强(可自定义根节点、包装字段)

最易被忽略的一点:SQL Server 的 JSON 功能全部依赖数据库兼容级别 ≥ 130,且 FOR JSON 在子查询中不能引用外部作用域的聚合别名(如 SELECT ..., (SELECT ... GROUP BY outer.id) FOR JSON 中的 outer.id 必须显式传入子查询 WHERE 条件)。跨层级引用失效是调试时最常见的卡点。

相关文章

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

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

下载

相关标签:

js json json数组

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

相关专题

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

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

2023.08.07

2015

5

json是什么
json是什么

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

2023.08.23

2882

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

3239

7

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4851

4

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2445

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3721

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2631

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

887

5

热门下载

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

精品课程

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

共101课时 | 20.7万人学习

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

共39课时 | 4.8万人学习