【问题标题】:SQL json_array_get - to search an object instead of positionSQL json_array_get - 搜索对象而不是位置
【发布时间】:2021-10-15 13:28:34
【问题描述】:

我正在尝试从以下查询中的列中获取值:

SELECT 
    json_array_get(transactions.tags,0) as category,
    transactions.tags, 
    transactions.date as transaction_date,
    transactions.amount,
    CAST(transactions.amount as DECIMAL(20, 2)) as amount_banking,
    transactions.balance,
    opportunity.osc_score_previous_conduct
FROM "decisionengine"."public"."app_banking_transaction" AS "transactions"
LEFT JOIN 
    "decisionengine"."public"."app_banking_transactionbankdetail" AS "transactionsDetails" 
ON 
    "transactionsDetails".id  = "transactions".transactionBankDetail_id 
    
LEFT JOIN 
    "decisionengine"."public"."app_banking_bankingdetail" AS "banking" 
ON 
    "transactionsDetails".bankingDetail_id  = "banking".id 
    
LEFT JOIN 
    "decisionengine"."public"."app_banking_opportunitydetail" AS "opportunity" 
ON 
    "banking".opportunity_id  = "opportunity".id 
LIMIT 5

在标签列上有时会有一个带有节点类别的对象,如果该节点存在于该 JSON 中,我想提取类别的值。

我可以看到 json_array_get 允许我在数组中获得一个位置,有没有办法使用它或者我如何修改我的查询以获得类别的值?


编辑

WITH dataset AS (
    SELECT * FROM (SELECT tags FROM "decisionengine"."public"."app_banking_transaction" LIMIT 10) AS t (json_string)
)

SELECT
    reduce(
        CAST (json_string as ARRAY(MAP(VARCHAR, VARCHAR))),
        map(),
        (s, x) -> map_concat(s,x), 
        s -> s
    )['category']
FROM dataset

我得到了错误

【问题讨论】:

    标签: sql amazon-athena presto


    【解决方案1】:

    要访问 category 值,您可以使用下一个 json 路径:$.[?(@.category)].category(将返回带有值的数组),但 Athena 中的 json 路径支持不是很好,因此您需要执行一些转换 - 首先转换 json到地图数组,然后将它们与reduce 连接到一张地图,最后从结果地图中提取category 值:

    WITH dataset AS (
        SELECT * FROM (VALUES   
           ( JSON '[{"category": "test"},{"prop":2}]'),
           ( JSON '[{"id":"1"}]'),                   
           ( JSON '[{"category": "test1"}, {"prop":2}]')
     ) AS t (json_string))
    
    
    SELECT
     reduce(
       CAST (json_string as ARRAY(MAP(VARCHAR, VARCHAR))),
       map(),
       (s, x) -> map_concat(s,x), 
       s -> s
     )['category']
    FROM dataset
    

    输出:

    _col0
    test
     
    test1

    【讨论】:

    • 我应该提到的是一个联邦查询,尽管如此,我测试了你的 sql 并且它工作但我无法将它转换为我的 sql,我收到一个错误 Cannot cast varchar to array(map (varchar, varchar)):我已经修改了我的问题以添加对您的 sql 的修改,但是如果这可行,我无法看到我将如何将它与我的表的其余部分加入
    • @Manza 在您的查询中尝试JSON tag,或CAST(tag AS JSON)
    • JSON_PARSE(tags) 有效,:) 我是否需要加入才能获取其他列?我对这部分有点困惑抱歉
    • @Manza 然后下一个应该是json_parse(tags)
    • @Manza 我会说你不需要整个 with dataset as ... - 我只是用它来创建测试数据,你可以使用 reduce(...) 作为原始查询的一部分(而不是 @ 987654332@)
    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 2014-07-26
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多