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

IBM DB2 11.1中JSON_ARRAYAGG使用报错,求实现嵌套JSON输出

问题分析与解决方案

报错原因

DB2 11.1版本的JSON_ARRAYAGG函数不支持在函数内部直接使用ORDER BY子句,这是触发SQLCODE=-104语法错误的核心原因。该版本的JSON_ARRAYAGG仅接受聚合表达式作为参数,无法直接追加排序逻辑。此外原SQL还存在其他语法问题:

  • 错误用VALUES和JSON_ARRAY嵌套包裹查询结果,造成结构冗余
  • FORMAT JSON的位置不符合语法规范
  • JSON键名大小写与预期输出不匹配(原SQL用大写,预期为小写)

修正后的SQL语句

基础版本(生成预期JSON结构)

SELECT JSON_OBJECT(
         'id' VALUE c.ID,
         'name' VALUE c.NAME,
         'addresses' VALUE JSON_ARRAYAGG(
           JSON_OBJECT(
             'address' VALUE ca.ADDRESS,
             'city' VALUE ca.CITY
           )
         )
       ) AS customer_json
FROM CUSTOMER c
JOIN CUSTOMER_ADDRESS ca ON ca.ADDRESS_CUSTOMER_ID = c.ID
GROUP BY c.ID, c.NAME
ORDER BY c.ID;

带地址排序的版本

由于DB2 11.1不支持JSON_ARRAYAGG直接追加ORDER BY,可通过子查询预先排序关联表数据,实现地址数组按ADDRESS排序:

SELECT JSON_OBJECT(
         'id' VALUE c.ID,
         'name' VALUE c.NAME,
         'addresses' VALUE JSON_ARRAYAGG(
           JSON_OBJECT(
             'address' VALUE ca.ADDRESS,
             'city' VALUE ca.CITY
           )
         )
       ) AS customer_json
FROM CUSTOMER c
JOIN (
       SELECT ADDRESS_CUSTOMER_ID, ADDRESS, CITY
       FROM CUSTOMER_ADDRESS
       ORDER BY ADDRESS_CUSTOMER_ID, ADDRESS
     ) ca ON ca.ADDRESS_CUSTOMER_ID = c.ID
GROUP BY c.ID, c.NAME
ORDER BY c.ID;

关键说明

  • 排序逻辑:通过子查询预先对CUSTOMER_ADDRESS按客户ID分组、地址字段排序,确保聚合后的数组元素顺序符合要求
  • 格式匹配:将JSON键名调整为小写(id、name、addresses),与预期输出完全一致
  • 语法规范:移除冗余的VALUES和JSON_ARRAY包裹,直接查询生成目标JSON对象,GROUP BY逻辑符合DB2语法要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:25:17