MySQL中扁平化JSON对象:key字段始终为空的求助
解决MySQL JSON列扁平化问题
你的原SQL无法正确获取key列的值,原因是'$.*'路径遍历的是JSON对象的属性值(比如["mobiles"]这类数组),而非键值对的键名,导致key字段拿到的是属性值本身,而非你需要的category、specs这类键名。
以下是可以正确实现需求的SQL语句:
SELECT jt_key.`key`, jt_value.`value` FROM table_name -- 提取JSON对象的所有键并展开为行 CROSS JOIN JSON_TABLE( JSON_KEYS(column_name), '$[*]' COLUMNS (`key` VARCHAR(255) PATH '$') ) AS jt_key -- 根据键提取对应数组,再展开数组元素为行 CROSS JOIN JSON_TABLE( JSON_EXTRACT(column_name, CONCAT('$.', jt_key.`key`)), '$[*]' COLUMNS (`value` VARCHAR(255) PATH '$') ) AS jt_value;
逻辑说明:
- 提取键名:通过
JSON_KEYS(column_name)获取JSON对象的所有键,再用JSON_TABLE将键数组展开为单独的行,每行对应一个键(如category、specs)。 - 展开数组元素:针对每个键,用
JSON_EXTRACT获取对应的数组值,再通过JSON_TABLE将数组的每个元素展开为单独的行,最终得到键与元素一一对应的扁平化结果。
执行该语句后,即可得到你想要的两列格式输出。
内容的提问来源于stack exchange,提问作者ganLover
相关产品推荐
相关产品推荐

