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

MySQL JSON列提取数组对象指定键的实现方案问询

解决方案(针对MySQL 8.0+)

假设你的表名为your_table,JSON列名为our_column,表有主键id用于分组原表的每一行数据。以下是三种格式的实现方式:

1. 生成字符串格式 "3 - 47.56, 2 - 15.41"

通过JSON_TABLE将JSON数组拆分为多行,拼接每个对象的plys和length字段,再用GROUP_CONCAT聚合为目标字符串:

SELECT 
  GROUP_CONCAT(CONCAT(j.plys, ' - ', j.length) SEPARATOR ', ') AS formatted_string
FROM your_table t
JOIN JSON_TABLE(
  t.our_column,
  '$[*]' COLUMNS(
    plys INT PATH '$.plys',
    length DECIMAL(10,2) PATH '$.length'
  )
) j
GROUP BY t.id;

2. 生成嵌套JSON数组 "[[3, 47.56], [2, 15.41]]"

拆分JSON数组后,用JSON_ARRAY构造每个元素的小数组,再通过JSON_ARRAYAGG聚合为嵌套数组:

SELECT 
  JSON_ARRAYAGG(JSON_ARRAY(j.plys, j.length)) AS nested_json_array
FROM your_table t
JOIN JSON_TABLE(
  t.our_column,
  '$[*]' COLUMNS(
    plys INT PATH '$.plys',
    length DECIMAL(10,2) PATH '$.length'
  )
) j
GROUP BY t.id;

3. 生成过滤后的JSON数组 "[{ "plys": 3, "length": 47.56 }, { "plys": 2, "length": 15.41 }]"

有两种实现方式:

方式一(MySQL 8.0.17+ 推荐):用JSON_TRANSFORM直接移除end字段

SELECT 
  JSON_TRANSFORM(t.our_column, '$.[] REMOVE $.end') AS filtered_json
FROM your_table t;

方式二(兼容低版本):拆分后重新构造对象再聚合

SELECT 
  JSON_ARRAYAGG(JSON_OBJECT('plys', j.plys, 'length', j.length)) AS filtered_json
FROM your_table t
JOIN JSON_TABLE(
  t.our_column,
  '$[*]' COLUMNS(
    plys INT PATH '$.plys',
    length DECIMAL(10,2) PATH '$.length'
  )
) j
GROUP BY t.id;

注意事项

  • 如果JSON列可能存在NULL或空数组,可以用IFNULL处理,比如IFNULL(JSON_TRANSFORM(...), '[]')
  • 字段类型(如INT、DECIMAL(10,2))可根据实际数据类型调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:02:31