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

如何在MySQL查询中将JSON对象转为键值对数组格式?

MySQL JSON对象转键值对数组解决方案

原表结构

iddata
1{"tags": {"env": "dev", "owner": "me"}}

期望输出结构

iddata
1{"tags": [{"key": "env", "value": "dev"}, {"key": "owner", "value": "me"}]}

之前的错误输出

iddata
1{"tags": [{"key": "env", "value": ["dev", "me"]}, {"key": "owner", "value": ["dev", "me"]}]}

解决方法

使用MySQL 8.0及以上版本支持的JSON函数组合,将JSON对象的键值对拆分为独立行后重新聚合为目标格式:

方案1:使用JSON_EACH展开键值对

SELECT 
    id,
    JSON_OBJECT(
        'tags',
        JSON_ARRAYAGG(
            JSON_OBJECT(
                'key', JSON_UNQUOTE(JSON_KEY(j.item)),
                'value', JSON_UNQUOTE(JSON_EXTRACT(j.item, '$.*'))
            )
        )
    ) AS data
FROM 
    your_table,
    JSON_EACH(data->'$.tags') AS j
GROUP BY 
    id;

方案2:使用JSON_TABLE解析键值对

SELECT 
    id,
    JSON_OBJECT(
        'tags',
        JSON_ARRAYAGG(
            JSON_OBJECT('key', tag_key, 'value', tag_value)
        )
    ) AS data
FROM 
    your_table,
    JSON_TABLE(
        data->'$.tags',
        '$.*' COLUMNS(
            tag_key VARCHAR(255) PATH '$."$key"',
            tag_value VARCHAR(255) PATH '$."$value"'
        )
    ) AS tag_items
GROUP BY 
    id;

说明

  • 上述方案依赖MySQL 8.0及以上版本,低版本不支持JSON_EACH、JSON_TABLE等函数。
  • 核心逻辑是先将tags下的JSON对象拆分为key-value的独立行,再通过JSON_ARRAYAGG聚合为数组,最后用JSON_OBJECT包装成目标结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:46:00