如何在snowflake中将数组解包为行?

qqrboqgw  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(304)

我有一张像雪花一样的table:

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" } ]

如何将此列表的每个索引中的每个“item”元素拆分为自己的行,并将每个代码作为一个字符串?
更新:这是我得到的答案与下面的答案同时工作,看起来我们都使用了扁平化:

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

kuhbmx9i1#

所以正如你所注意到的,你已经硬编码进入密码,通过 codes[0] 这将提供该数组中的第一项,如果使用“展平”,则可以访问第一个数组中的所有对象。

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 ,所以我们使用另一个展平:

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 如何访问所需的部件。

相关问题