【发布时间】:2021-11-11 18:04:32
【问题描述】:
在 Athena 中,我们试图获取所有含有种子的水果。我们面临的问题是种子 true/false 嵌套在 json 中,我们似乎无法在 WHERE 子句中对其进行过滤。我们只能在嵌套的 json 路径中将 SELECT 它作为 hasSeeds 时看到结果,但这会返回所有种子结果 true 和 false 而不仅仅是 true
-- This returns all seeds, but we want to filter in the WHERE clause by hasSeeds true
SELECT foodId, foodType, json_extract(payload,'$.food.info.seeds') AS hasSeeds
FROM "food_table"
WHERE foodType = 'fruit'
-- 3 attempts to filter by nested json value seeds true (not working)
SELECT * FROM
(SELECT foodId, foodType, json_extract(payload,'$.food.info.seeds') AS hasSeeds
FROM "food_table"
WHERE foodType = 'fruit')
WHERE hasSeeds = true
SELECT foodId, foodType, json_extract(payload,'$.food.info.seeds') AS hasSeeds
FROM "food_table"
WHERE foodType = 'fruit' and hasSeeds = true
SELECT foodId, foodType, json_extract(payload,'$.food.info.seeds') AS hasSeeds
FROM "food_table"
WHERE foodType = 'fruit' and json_extract(payload,'$.food.info.seeds') = true
知道如何在嵌套 json 上按 hasSeeds true 过滤时让查询按预期工作吗?
使用 JSON 结构更新:
{
"foodId": 1,
"foodType": "fruit",
"payload": {
"food": {
"name": "apple",
"info": {
"seeds": true,
"calories": 95
}
}
}
}
{
"foodId": 2,
"foodType": "fruit",
"payload": {
"food": {
"name": "banana"
}
}
}
{
"foodId": 3,
"foodType": "vegetable",
"payload": {
}
}
{
"foodId": 4,
"foodType": "fruit",
"payload": {
}
}
尝试了这个查询,但返回的结果不正确:
WITH dataset(jsn) AS (
values (JSON '{"payload":{"food":{"info":{"seeds":true}}}}')
)
SELECT foodId, foodType, json_extract(payload,'$.food.info.seeds') AS hasSeeds, jsn
FROM "food_table", dataset
WHERE cast(json_extract_scalar(jsn, '$.payload.food.info.seeds') AS BOOLEAN) = true
基本上,hasSeeds 返回为 true,这是正确的,但其他食品,例如那些缺少有效载荷的孩子的食品仍然使用 jsn 字段返回,而不是实际上仅通过类似的方式仅查询 WHERE 子句payload.food.info.seeds = true
知道怎么解决吗?
【问题讨论】:
-
你能分享一下json例子吗?
-
更新了 json 示例
标签: json amazon-dynamodb amazon-athena