【问题标题】:How to fetch value inside a Nested JSON in Snowflake (based on value present inside the same JSON)如何在 Snowflake 中的嵌套 JSON 中获取值(基于相同 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 专家。

【问题讨论】:

    标签: arrays json snowflake-cloud-data-platform flatten


    【解决方案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 很高兴我能帮上忙。如果您发现此解决方案是您问题的答案,请随时将其标记为正确答案。谢谢。
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多