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
相关产品推荐
相关产品推荐

