我在雪花数据库表中具有VARCHAR(16777216)列,该列结构为其中包含JSON的数组。
列中的行示例:[ {"Name":"John", "Last Name": "Doe"}, {"Name":"Frank", "Last Name": "Doe"}]
如何使用sql选择每一行中的所有姓氏?
请注意,这是一个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;
此返回:
LAST_NAME
"Doe"
"Doe"
在查询中,LATERAL FLATTEN
部分表示在将文本解析为JSON之后为文本中的每个条目返回一行,然后在SELECT
列表中,json_object.value
返回该行的值,并且:"Last Name"
从中返回名为Last Name
的字段。 WITH SampleData (...)
部分仅使用名为VARCHAR
的text
列创建一些内联数据。
如果每个输入行只需要一行,其中姓氏在数组中,则可以使用这种形式的查询:
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;
此返回:
LAST_NAMES
[ "Doe", "Doe" ]