【问题标题】:How to unpack Array to Rows in Snowflake?如何将数组解包到雪花中的行?
【发布时间】:2021-07-20 06:41:52
【问题描述】:

我在 Snowflake 中有一个如下所示的表格:

ID | CODES
2  | [ { "list": [ { "item": "CODE1" }, { "item": "CODE2" } ] } ]

我想把它变成:

ID | CODES
2  | 'CODE1'
2  | 'CODE2'

到目前为止我已经尝试过

SELECT ID,CODES[0]:list
FROM MY_TABLE

但这只能让我明白:

ID | CODES
2  | [ { "item": "CODE1" }, { "item": "CODE2" } ]

如何将此列表的每个索引中的每个“项目”元素分解为自己的行,每个 CODE 作为字符串?

更新:这是我与下面的答案同时工作的答案,看起来我们都使用了 FLATTEN:

SELECT ID,f.value:item
FROM MY_TABLE,
lateral flatten(input => MY_TABLE.CODES[0]:list) f

【问题讨论】:

    标签: sql arrays json list snowflake-cloud-data-platform


    【解决方案1】:

    因此,正如您所注意到的,您已经通过 codes[0] 硬编码了您对代码的访问权限,它为您提供了该数组中的第一项,如果您使用 FLATTEN,您可以访问第一个数组的所有对象。

    WITH my_table(id,codes) AS (
      SELECT 2, parse_json('[ { "list": [ { "item": "CODE1" }, { "item": "CODE2" } ] } ]')
    )
    SELECT ID, c.*
    FROM my_table,
        table(flatten(codes)) c;
        
    

    给予:

    2   1       [0] 0   { "list": [ { "item": "CODE1" }, { "item": "CODE2" }]}  [    {      "list": [{"item": "CODE1"}, { "item": "CODE2" }]}]
    

    所以现在你想遍历list 中的项目,所以我们在上面使用另一个 FLATTEN:

    WITH my_table(id,codes) AS (
      SELECT 2, parse_json('[ { "list": [ { "item": "CODE1" }, { "item": "CODE2" } ] } ]')
    )
    SELECT ID, c.value, l.value
    FROM my_table,
        table(flatten(codes)) c,
        table(flatten(c.value:list)) l;
    

    给予:

    2   {"list":[{"item": "CODE1"},{"item":"CODE2"}]}   {"item":"CODE1"}
    2   {"list":[{"item": "CODE1"},{"item":"CODE2"}]}   {"item":"CODE2"}
    

    这样您就可以分解l.value 访问所需部件的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 2022-09-22
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      相关资源
      最近更新 更多