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
我正在尝试从以下查询中的列中获取值:
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 |