如何在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
相关产品推荐
相关产品推荐

