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

Oracle SQL实现重复ID数据按ID分组生成JSON格式结果

将重复ID的表数据按ID聚合为JSON格式的SQL实现

现有一张包含重复ID的表,需要编写SELECT语句,将每个重复ID对应的所有数据转换为JSON格式输出,且ID不包含在JSON内容中。

原始表数据

id,yyyy,name 
1,2010,a  
1,2011,b
2,2010,a
3,2010,c
3,2011,a
4,2011,v

期望输出结果

id, column(json) 
1     {"2010":"a","2011":"b"}
2     {"2010":"a"}
3     {"2010":"c","2011":"a"}
4     {"2011":"v"}

注:原期望结果中id=2的JSON存在笔误,对应原始表数据仅一条记录,修正后应为{"2010":"a"}

针对不同数据库的实现方案

MySQL 5.7+

使用JSON_OBJECTAGG函数直接聚合键值对:

SELECT 
    id,
    JSON_OBJECTAGG(yyyy, name) AS json_column
FROM 
    your_table -- 替换为你的表名
GROUP BY 
    id;

如果同一ID下存在重复的yyyy值,该函数会保留分组内最后一条匹配的记录值。

PostgreSQL 9.4+

使用json_object_agg函数完成聚合:

SELECT 
    id,
    json_object_agg(yyyy, name) AS json_column
FROM 
    your_table -- 替换为你的表名
GROUP BY 
    id;

若同一ID下存在重复的yyyy键,默认会抛出错误。如果需要保留最后一条记录,可改用jsonb_object_agg并指定排序优先级:

SELECT 
    id,
    jsonb_object_agg(yyyy, name ORDER BY id) AS json_column
FROM 
    your_table -- 替换为你的表名
GROUP BY 
    id;

SQL Server 2016+

通过STRING_AGG拼接键值对字符串,再转换为JSON对象:

SELECT 
    id,
    JSON_QUERY('{' + STRING_AGG('"' + CAST(yyyy AS VARCHAR(4)) + '":"' + REPLACE(name, '"', '""') + '"', ',') + '}') AS json_column
FROM 
    your_table -- 替换为你的表名
GROUP BY 
    id;

使用REPLACE是为了转义name字段中的双引号,避免生成非法JSON格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:40:13