You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中基于ID将JSON结果分组为嵌套数组的实现方法

按Id分组生成嵌套JSON格式的解决方案

要实现你需要的将相同Id的条目归入同一子数组的嵌套JSON结构,我们可以调整原来的FOR JSON AUTO语句,通过分组聚合+JSON数组构造的方式来完成,具体方案如下:

最终可用的SQL语句(替换存储过程中原有的JSON生成语句)

SELECT 
    JSON_QUERY((
        SELECT accountid, Id, name 
        FROM TestJsonFormat t2 
        WHERE t2.Id = t1.Id 
        FOR JSON PATH
    )) AS matchItem
FROM TestJsonFormat t1
GROUP BY t1.Id
FOR JSON PATH, ROOT('match')

执行效果

这条语句会输出你期望的嵌套格式:

{
    "match": [
        [
            { "accountid":"12312312", "Id":1, "name":"Ace Signs Ltd" },
            { "accountid":"12312312", "Id":1, "name":"Ace Signs Ltd" }
        ],
        [
            { "accountid":"213123123", "Id":2, "name":"Workshare Technology" },
            { "accountid":"123123123", "Id":2, "name":"Workshare" }
        ]
    ]
}

语句逻辑拆解

  • 内层子查询:针对每个唯一的Id,查询该Id对应的所有记录,用FOR JSON PATH生成这个Id专属的JSON数组。
  • JSON_QUERY函数:这里必须用它来处理内层的JSON数组,否则SQL Server会自动给数组添加引号和转义字符,导致嵌套结构出错。它的作用是告诉SQL Server:这部分是合法的JSON,直接嵌入结果即可。
  • GROUP BY t1.Id:按Id分组,确保每个唯一Id只生成一条外层记录,避免重复的分组结果。
  • 外层的FOR JSON PATH, ROOT('match'):把所有分组后的子数组包裹在match根节点下,形成最终的外层结构。

测试数据补充说明

如果你还没创建测试表,先执行以下SQL初始化数据(注意accountid是varchar类型,值要加单引号):

CREATE TABLE TestJsonFormat ( 
    accountid varchar(255), 
    Id int, 
    name varchar(255) 
)
insert into TestJsonFormat values('12312312',1,'Ace Signs Ltd')
insert into TestJsonFormat values('213123123',2,'Workshare Technology')
insert into TestJsonFormat values('12312312',1,'Ace Signs Ltd')
insert into TestJsonFormat values('123123123',2,'Workshare')

内容的提问来源于stack exchange,提问作者Sindu_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:42:47