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

如何在Athena中从含动态键的嵌套JSON提取Max/Min值?

问题描述

我有如下JSON结构:

{"GrossORNet":"Net","Term":"Monthly","Tier":{"All":{"1":{"Max":"100000","Min":"1","Rate":"15","StartDate":"2021-02-01","EndDate":"2021-02-01"}}}}

使用以下查询可成功获取Tier的值:

select  json_extract(
            '{"GrossORNet":"Net","Term":"Monthly","Tier":{"All":{"1":{"Max":"100000","Min":"1","Rate":"15","StartDate":"2021-02-01","EndDate":"2021-02-01"}}}}'
        , '$.Tier'
    )

但尝试用类似方式提取Max和Min值时返回空结果:

select  json_extract(
            '{"GrossORNet":"Net","Term":"Monthly","Tier":{"All":{"1":{"Max":"100000","Min":"1","Rate":"15","StartDate":"2021-02-01","EndDate":"2021-02-01"}}}}'
        , '$.Max'
    )

其中Tier下的"All"和"1"是动态键,值不固定。请问哪里操作错误?

错误原因
  • JSON路径定位错误:$.Max是从JSON根节点直接查找Max字段,但Max实际嵌套在Tier -> 动态键 -> 动态键的层级下,根节点不存在该字段,所以返回空。
  • 未处理动态键:即使写成$.Tier.All.1.Max,也只能匹配固定键名的情况,一旦"All"或"1"的键值变化,查询就会失效,必须用通配符适配动态键场景。
解决方法

使用JSONPath的通配符*匹配任意动态键,直接定位到嵌套的Max/Min字段:

select  json_extract(
            '{"GrossORNet":"Net","Term":"Monthly","Tier":{"All":{"1":{"Max":"100000","Min":"1","Rate":"15","StartDate":"2021-02-01","EndDate":"2021-02-01"}}}}'
        , '$.Tier.*.*.Max'
    ) as MaxValue,
    json_extract(
            '{"GrossORNet":"Net","Term":"Monthly","Tier":{"All":{"1":{"Max":"100000","Min":"1","Rate":"15","StartDate":"2021-02-01","EndDate":"2021-02-01"}}}}'
        , '$.Tier.*.*.Min'
    ) as MinValue
  • $.Tier.*:匹配Tier下的任意子键(比如"All"或其他动态值)
  • .*:匹配该子键下的任意子键(比如"1"或其他动态数字/字符串键)
  • 最后.Max/.Min精准定位到目标字段

如果你的SQL引擎支持数组转换类函数,也可以先将动态层级转为数组再提取,但通配符方式是适配动态键场景最直接的方案。


内容的提问来源于stack exchange,提问作者Md. Parvez Alam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 08:33:18