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

SQL查询嵌套JSON列:提取二级对象并保留一级键的方案

从动态键的嵌套JSON中提取带键的对应值

我需要从表中某列的嵌套JSON里提取值,目前能拿到返回值,但无法同时获取对应的一级JSON键,且查询仅返回1行数据。

示例JSON

{
    "key1": {
        "data1": "data1 object",
        "data2": "data2 object"
    },
    "key2": {
        "data1": "data1 object",
        "data2": "data2 object"
    }
}

其中一级键(如key1、key2)是动态生成的,二级的data类键是固定的。

期望结果(两种均可)

结果1(保留二级结构)

{
    "key1": {
        "data1": "data1 object"
    },
    "key2": {
        "data1": "data1 object"
    }
}

结果2(直接映射键值)

{
    "key1": "data1 object",
    "key2": "data1 object"
}

当前未生效的查询

SELECT
    json->>"$.*.data1" AS data
FROM table
WHERE id=1;

当前输出

[
    "data1 object",
    "data1 object"
]

解决方案(以PostgreSQL为例)

方案1:获取直接键值映射(对应结果2)

通过json_each拆分顶层JSON为键值对,筛选出data1的值后重新聚合:

SELECT json_object_agg(k, v->>'data1') AS result
FROM your_table,
     json_each(json_column) AS j(k, v)
WHERE id = 1;

执行后返回:

{"key1": "data1 object", "key2": "data1 object"}

方案2:保留二级嵌套结构(对应结果1)

调整聚合逻辑,保留data1的嵌套格式:

SELECT json_object_agg(k, json_build_object('data1', v->>'data1')) AS result
FROM your_table,
     json_each(json_column) AS j(k, v)
WHERE id = 1;

执行后返回:

{"key1": {"data1": "data1 object"}, "key2": {"data1": "data1 object"}}

注意事项

  • 若你的JSON列类型是jsonb,只需将json_each替换为jsonb_each,json_object_agg替换为jsonb_object_agg即可兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:05:20