如何从雪花数据库中的 Varchar "JSON Array" select 元素?

How to select element from Varchar "JSON Array" in snowflake database?

我在雪花数据库 table 中有一个 VARCHAR(16777216) 列,它的结构是一个包含 JSON 的数组。

列中一行的示例:[ {"Name":"John", "Last Name": "Doe"}, {"Name":"Frank", "Last Name": "Doe"}]

如何使用 sql 来 select 每行中的所有姓氏?

请注意,这是一个 VARCHAR 列。

您可以展平 JSON 数组,然后像这样提取 Last Name 字段:

WITH SampleData AS (
  SELECT '[ {"Name":"John", "Last Name": "Doe"}, {"Name":"Frank", "Last Name": "Doe"}]' AS text
)
SELECT json_object.value:"Last Name" AS last_name
FROM SampleData, LATERAL FLATTEN (input => PARSE_JSON(text)) json_object;

这个returns:

LAST_NAME
"Doe"
"Doe"

在查询中,LATERAL FLATTEN 部分表示将文本中的每个条目解析为 JSON 后 return 一行,然后在 [=16] =] 列表,json_object.value return 是该行的值,:"Last Name" return 是其中名为 Last Name 的字段。 WITH SampleData (...) 部分只是用一个名为 text.

VARCHAR 列创建了一些内联数据

如果您希望每个输入行对应一行,其中姓氏在一个数组中,您可以使用以下形式的查询:

WITH SampleData AS (
  SELECT '[ {"Name":"John", "Last Name": "Doe"}, {"Name":"Frank", "Last Name": "Doe"}]' AS text
)
SELECT ARRAY_AGG(json_object.value:"Last Name") AS last_names
FROM SampleData, LATERAL FLATTEN (input => PARSE_JSON(text)) json_object
GROUP BY text;

这个returns:

LAST_NAMES
[    "Doe",    "Doe"  ]