我在 Snowflake 中有一张如下所示的表格:
+------+------+------+------------------------------------------------------------------+
| Col1 | Col2 | Col3 | Col4 |
+------+------+------+------------------------------------------------------------------+
| 1 | foo | 32 | [{"id":"1", "category":"black"}] |
| 2 | bar | 22 | [{"id":"1", "category":"black"}, {"id":"4", "category":"white"}] |
| 3 | smeg | 2 | null |
+------+------+------+------------------------------------------------------------------+
我想将数据转换到另一个表中,如下所示:
+------+------+------+------+----------+
| Col1 | Col2 | Col3 | id | category |
+------+------+------+------+----------+
| 1 | foo | 32 | 1 | black |
| 2 | bar | 22 | 1 | black |
| 2 | bar | 22 | 4 | white |
| 3 | smeg | 2 | null | null |
+------+------+------+------+----------+
我之前使用过 SQL Server 中完成此操作JSON_VALUE
,OPENJSON
但是在尝试寻找 Snowflake 等效项时遇到了困难。
对上述答案的修正,需要明确处理类别中的空值。
单独的横向展平不会考虑 NULL,您可以使用
OUTER => TRUE
或UNION
与条件一起使用WHERE Col4 IS NULL
。外部文档
输出
在 Snowflake 中,您可以使用
FLATTEN
函数来实现这一点,该函数旨在处理 JSON 数组等半结构化数据。此函数可以将存储在列内的数组扩展为多行。您还将使用它
OBJECT_GET
从 JSON 对象中提取特定字段。以下是如何在 Snowflake 中实现所需的转换:
SQL 查询:
解释:
FLATTEN(input => t.Col4)
:此函数将 JSON 数组展平为Col4
单独的行,其中数组中的每个 JSON 对象成为单独的行。f.value:id::STRING
:这将从id
JSON 对象中提取字段,确保将其转换为字符串。f.value:category::STRING
:这将从category
JSON 对象中提取字段,确保将其转换为字符串。LATERAL
:这用于允许FLATTEN
函数为 JSON 数组中的每个项目生成行。结果:
这将为您提供所需格式的输出:
处理空值:
null
如果中有Col4
,如第三行所示,FLATTEN
将返回和null
的值,这正是您想要的。id
category
此方法可有效处理扩展 JSON 字符串并提取 Snowflake 中所需的字段。如果您需要进一步说明,请告诉我!