SQL json_array_get - 搜索对象而不是位置

SQL json_array_get - to search an object instead of position

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

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

在tags列中有时会有一个带有节点类别的对象,如果该节点存在于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

我收到错误

要访问 category 值,您可以使用下一个 json 路径:$.[?(@.category)].category(return 数组包含值),但 json 路径支持Athena 不是那么好,因此您需要执行一些转换 - 首先将 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