【问题标题】:How to parse a list within a table in Snowflake using SQL如何使用 SQL 解析 Snowflake 中的表中的列表
【发布时间】:2021-11-06 09:24:22
【问题描述】:

所以我有一张这样的桌子:

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() 应该可以在这里工作,但我似乎无法理解。

【问题讨论】:

  • VALUE 列是数组还是字符串?
  • VARCHAR(16777216) 又名字符串
  • 好的。除非有人打败我,否则我会更新我的答案。
  • 很好,你的很接近;字符串转表的作用是什么?
  • 如果 VALUE 列被定义为数组,则上一个答案有效。 split_to_table 表函数更适合将分隔的字符串转换为行。

标签: sql snowflake-cloud-data-platform flatten


【解决方案1】:

我使用的是 FLATTEN 版本:

SELECT 
  ID, f.VALUE, t.KEY, DATE, USER
FROM
test t, table(
  FLATTEN(
    INPUT => STRTOK_TO_ARRAY(value, '[], "')
  )
) f;

【讨论】:

    【解决方案2】:

    嵌套的替换函数只是删除方括号,这样 split_to_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" <> ''
    ;
    

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多