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

如何使用JSON_TABLE拼接NESTED PATH提取的嵌套JSON数组值

解决方法

你现在得到多行结果是因为使用了NESTED PATH '$.keyNames[*]'把keyNames数组里的每个元素都拆成了单独的行,要合并成单个逗号分隔的字符串有两种常用方案:

方案1:分组聚合(兼容原有逻辑,改动最小)

不需要修改JSON_TABLE的结构,只需要在查询末尾加分组和字符串聚合函数即可,不同数据库的聚合函数略有差异:

MySQL/MariaDB 写法

SELECT 
  j.keyId,
  GROUP_CONCAT(j.keyNames SEPARATOR ', ') AS keyNames,
  j.keyDesc
FROM asknow a, JSON_TABLE(value, '$[*]' 
    COLUMNS(
      keyId TEXT PATH '$.keyId',
      NESTED PATH '$.keyNames[*]' COLUMNS (keyNames TEXT PATH '$'),
      keyDesc TEXT PATH '$.keyDesc')
    ) AS j
GROUP BY j.keyId, j.keyDesc;

PostgreSQL/SQL Server 2017+ 写法

把聚合函数替换为STRING_AGG即可:

SELECT 
  j.keyId,
  STRING_AGG(j.keyNames, ', ') AS keyNames,
  j.keyDesc
FROM asknow a, JSON_TABLE(value, '$[*]' 
    COLUMNS(
      keyId TEXT PATH '$.keyId',
      NESTED PATH '$.keyNames[*]' COLUMNS (keyNames TEXT PATH '$'),
      keyDesc TEXT PATH '$.keyDesc')
    ) AS j
GROUP BY j.keyId, j.keyDesc;

Oracle 11g+ 写法

SELECT 
  j.keyId,
  LISTAGG(j.keyNames, ', ') WITHIN GROUP (ORDER BY j.keyNames) AS keyNames,
  j.keyDesc
FROM asknow a, JSON_TABLE(value, '$[*]' 
    COLUMNS(
      keyId TEXT PATH '$.keyId',
      NESTED PATH '$.keyNames[*]' COLUMNS (keyNames TEXT PATH '$'),
      keyDesc TEXT PATH '$.keyDesc')
    ) AS j
GROUP BY j.keyId, j.keyDesc;

方案2:直接提取数组不拆分(性能更优)

如果不需要先拆成单行处理,完全可以去掉NESTED PATH配置,直接把keyNames数组转成逗号分隔的字符串,避免后续分组操作,以MySQL为例:

SELECT 
  j.keyId,
  REPLACE(REPLACE(REPLACE(JSON_UNQUOTE(JSON_EXTRACT(value, '$[0].keyNames')), '["', ''), '"]', ''), '","', ', ') AS keyNames,
  j.keyDesc
FROM asknow a, JSON_TABLE(value, '$[*]' 
    COLUMNS(
      keyId TEXT PATH '$.keyId',
      keyDesc TEXT PATH '$.keyDesc')
    ) AS j;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:12:01