Athena 使用动态键从嵌套 json 中提取值

问题描述 投票:0回答:1

我有以下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'
    )

类似的方式我试图获取最大值和最小值,但它不起作用,它返回空白

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'
    )

所有和1都是动态值,可能会不同

我做错了什么

谢谢,

sql amazon-athena presto jsonpath trino
1个回答
0
投票

我做错了什么

'$.Max'
是一个 JSON 路径 (RFC) 表达式。它代表 JSON 中的路径,在本例中,它将在根对象中查找
Max
属性,该属性显然不存在。

根节点标识符$指的是查询的根节点 论证,即整个论证。

Presto/Trino 中的

json_extract
对 JSON 路径表达式的支持非常少。这里有两个主要选项(如我之前的答案中所述) - 投射到地图或使用
json_query
。例如,如果您只有一把钥匙:

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

输出

  _col0
----------
 "100000"
(1 row)

对于多个值,可以使用

'lax $.Tier.*.*.Max' with array wrapper

© www.soinside.com 2019 - 2024. All rights reserved.