如何使用 SQL 在 Snowflake 中解析 table 中的列表
How to parse a list within a table in Snowflake using SQL
所以我有一个 table 这样的:
ID VALUE KEY DATE USER
001 ["a"] group1 2021-01-01 212
002 [] group2 2021-01-01 212
003 ["a","c"] group1 2021-01-02 212
004 ["apple", "pear"] group3 2021-01-02 211
我想重组这些数据,使每个列表元素成为它自己的行。如果 VALUE
是一个空列表,则期望它不会出现在最终数据集中。
最终结果应该是:
ID VALUE KEY DATE USER
001 "a" group1 2021-01-01 212
003 "a" group1 2021-01-02 212
003 "c" group1 2021-01-02 212
004 "apple" group3 2021-01-02 211
004 "pear" group3 2021-01-02 211
我认为在 Snowflake 中使用 FLATTEN()
在这里应该可以,但我似乎无法理解。
嵌套替换函数只是删除方括号,因此 split_to_table table 函数可以完成它的工作。
select T1.ID, V1."VALUE", T1.KEY, T1."DATE", T1."USER"
from TABLE1 T1, table(split_to_table(replace(replace(VALUE, '[', ''), ']', ''), ',')) V1
where V1."VALUE" <> ''
;
我使用的是 FLATTEN 版本:
SELECT
ID, f.VALUE, t.KEY, DATE, USER
FROM
test t, table(
FLATTEN(
INPUT => STRTOK_TO_ARRAY(value, '[], "')
)
) f;
所以我有一个 table 这样的:
ID VALUE KEY DATE USER
001 ["a"] group1 2021-01-01 212
002 [] group2 2021-01-01 212
003 ["a","c"] group1 2021-01-02 212
004 ["apple", "pear"] group3 2021-01-02 211
我想重组这些数据,使每个列表元素成为它自己的行。如果 VALUE
是一个空列表,则期望它不会出现在最终数据集中。
最终结果应该是:
ID VALUE KEY DATE USER
001 "a" group1 2021-01-01 212
003 "a" group1 2021-01-02 212
003 "c" group1 2021-01-02 212
004 "apple" group3 2021-01-02 211
004 "pear" group3 2021-01-02 211
我认为在 Snowflake 中使用 FLATTEN()
在这里应该可以,但我似乎无法理解。
嵌套替换函数只是删除方括号,因此 split_to_table table 函数可以完成它的工作。
select T1.ID, V1."VALUE", T1.KEY, T1."DATE", T1."USER"
from TABLE1 T1, table(split_to_table(replace(replace(VALUE, '[', ''), ']', ''), ',')) V1
where V1."VALUE" <> ''
;
我使用的是 FLATTEN 版本:
SELECT
ID, f.VALUE, t.KEY, DATE, USER
FROM
test t, table(
FLATTEN(
INPUT => STRTOK_TO_ARRAY(value, '[], "')
)
) f;