如何在 Snowflake 中的嵌套 JSON 中获取值(基于相同 JSON 中存在的值)
Posted
技术标签:
【中文标题】如何在 Snowflake 中的嵌套 JSON 中获取值(基于相同 JSON 中存在的值)【英文标题】:How to fetch value inside a Nested JSON in Snowflake (based on value present inside the same JSON) 【发布时间】:2021-07-26 09:14:52 【问题描述】:我有一个如下所示的 JSON 对象:
"K":"5",
"DE":[
"H[1]":"1-162001524",
"H[2]":"2-162001534",
"H[3]":"3-162001540",
"H[4]":"5-162001559",
"H[5]":"6-162001563"
]
现在,我希望根据我的选择查询中的 K 值从 DE 数组中获取数据。因此,从上面的示例中,它应该给我 H[5] 的值,即 6-162001563。 我尝试了几种不同的方法,但没有运气。
有人可以帮我解决这个问题吗?
免责声明:我不是 JSON 专家。
【问题讨论】:
【参考方案1】:这不是最有说服力的,但它确实有效。假设我使用以下语句创建了一个 CTE,以类似于您的 JSON 数据:
WITH x as (
SELECT parse_json('"K":"5",
"DE":[
"H[1]":"1-162001524",
"H[2]":"2-162001534",
"H[3]":"3-162001540",
"H[4]":"5-162001559",
"H[5]":"6-162001563"
]
') as var
)
然后您可以展平数组,根据 get_path()
语句搜索值,您必须将 K 值和额外字符一起解析以生成路径。这为您提供了数组中的所有记录,但随后搜索非 NULL 记录,您将获得所需的输出。
SELECT get_path(y.value,'"H['||x.var:K::varchar||']"')::varchar as output
FROM x,
LATERAL FLATTEN(input=>var:DE) y
WHERE output IS NOT NULL;
【讨论】:
非常感谢@mikewalton。它工作得很好。我的包含 JSON 的源列是一个 varchar。所以,我不得不稍微调整一下查询并添加 PARSE_JSON,它运行顺利。 @Kshitij 很高兴我能帮上忙。如果您发现此解决方案是您问题的答案,请随时将其标记为正确答案。谢谢。以上是关于如何在 Snowflake 中的嵌套 JSON 中获取值(基于相同 JSON 中存在的值)的主要内容,如果未能解决你的问题,请参考以下文章
在我们将其解析为 JSON 之前,Snowflake 如何转义对象数组字符串中的所有特殊字符?
如何从 SnowFlake 中的 JSON 字符串解析特定数据?