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

MySQL如何将JSON提取的labelKey数组展平为单行单值?

数组展平实现方案

不同数据库的JSON数组行转列语法略有差异,以下是主流数据库的实现方式:

MySQL 8.0+ 版本

MySQL 8.0 提供了JSON_TABLE函数专门处理JSON数组转多行的需求,直接嵌套在原查询的FROM子句中即可:

SELECT 
  labelKey
FROM d_json j,
JSON_TABLE(
  j.data->'$.options[*].labelKey',
  '$[*]' COLUMNS (labelKey VARCHAR(255) PATH '$')
) AS t;

你原来的双层JSON_EXTRACT写法也可以简化为j.data->'$.options[*].labelKey',效果完全一致。如果是MySQL 5.x版本没有JSON_TABLE,可以借助辅助数字序列的方式实现:

  • 先构建一个包含连续数字的临时序列,数字范围要覆盖你单个options数组的最大长度
  • 用数字作为下标逐个提取数组元素
    示例代码:
-- 假设你的options数组最多不超过10个元素
SELECT 
  JSON_UNQUOTE(JSON_EXTRACT(j.data, CONCAT('$.options[', n.idx, '].labelKey'))) AS labelKey
FROM d_json j
JOIN (
  SELECT 0 AS idx UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
  UNION ALL SELECT 8 UNION ALL SELECT 9
) n ON n.idx < JSON_LENGTH(j.data->'$.options')
WHERE JSON_EXTRACT(j.data, CONCAT('$.options[', n.idx, '].labelKey')) IS NOT NULL;

PostgreSQL 版本

PostgreSQL 可以用jsonb_array_elements_text函数直接展开数组:

SELECT 
  jsonb_array_elements_text(j.data->'options'->'labelKey') AS labelKey
FROM d_json j;

如果你的data字段是json类型而非jsonb,把jsonb_array_elements_text替换成json_array_elements_text即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:36:01