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

如何将含动态Key的JSON对象键值对拆分为单独行?已试JSON_EXTRACT

解决动态Key的JSON Map拆分行问题

针对你这种动态Key的JSON Map拆分需求,不同数据库有对应的解决方案,以下是主流数据库的实现方式:

PostgreSQL(9.4+)

PostgreSQL原生支持json_each(处理JSON类型)和jsonb_each(处理JSONB类型)函数,可直接将JSON对象拆分为Key-Value行:

假设你的表名为test_table,存储包含dayValueMap的JSON字段为data,执行以下查询:

SELECT 
    key AS day, 
    value::int AS count  -- 根据实际值类型转换
FROM 
    test_table, 
    jsonb_each(data->'dayValueMap');

jsonb_each会把dayValueMap里的每一组键值对拆成单独的行,key对应日期,value对应数值。

MySQL(8.0+)

MySQL 8.0及以上可以通过递归CTE结合JSON函数处理任意数量的动态Key:

WITH RECURSIVE idx_list AS (
    SELECT 0 AS idx
    UNION ALL
    SELECT idx + 1 FROM idx_list 
    WHERE idx < (SELECT MAX(JSON_LENGTH(JSON_KEYS(data->'dayValueMap'))) FROM test_table)
)
SELECT 
    JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(t.data->'dayValueMap'), CONCAT('$[', idx, ']'))) AS day,
    JSON_UNQUOTE(JSON_EXTRACT(t.data->'dayValueMap', CONCAT('$.', JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(t.data->'dayValueMap'), CONCAT('$[', idx, ']')))))) AS value
FROM 
    test_table t
JOIN idx_list ON idx < JSON_LENGTH(JSON_KEYS(t.data->'dayValueMap'));

这段SQL先通过递归生成索引序列,再逐个提取dayValueMap的Key和对应的Value,无需提前知道Key的数量。

BigQuery

BigQuery可以用JSON_OBJECT_KEYS结合UNNEST来拆分:

SELECT
    day,
    JSON_EXTRACT_SCALAR(data, CONCAT('$.dayValueMap.', day)) AS value
FROM
    `your-project.your-dataset.your-table`,
    UNNEST(JSON_OBJECT_KEYS(data.dayValueMap)) AS day;

JSON_OBJECT_KEYS会提取dayValueMap的所有Key,UNNEST将这些Key拆成单独行,最后通过CONCAT动态拼接路径获取对应Value。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:25:27