如何在 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(反向横向展平)

在我们将其解析为 JSON 之前,Snowflake 如何转义对象数组字符串中的所有特殊字符?

如何从 SnowFlake 中的 JSON 字符串解析特定数据?

如何将 JSON 字典列表转换为 Snowflake 中的字符串列表?

如何在 Snowflake 中将 json 转换为表格格式

在 Snowflake 中从表中取消嵌套