【问题标题】:How to select element from Varchar "JSON Array" in snowflake database?如何从雪花数据库中的 Varchar“JSON Array”中选择元素?
【发布时间】:2020-01-10 15:30:21
【问题描述】:

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

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

如何使用 sql 选择每行中的所有姓氏?

请注意,这是一个 VARCHAR 列。

【问题讨论】:

  • 由于列定义为 VARCHAR,因此您无法通过 SQL 直接处理 JSON。根据您使用的关系数据库,您可以将列定义为显式 JSON 类型,并使用相应的查询来处理记录。 MySQL 中的示例:dev.mysql.com/doc/refman/8.0/en/json.html 因此,在您的情况下,由于您的列是 VARCHAR,您需要提取整个记录并通过您使用的任何编程语言务实地处理 JSON。我个人更喜欢在所有情况下都这样做。

标签: sql arrays get varchar snowflake-cloud-data-platform


【解决方案1】:

您可以展平 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 (...) 部分只是使用名为 textVARCHAR 列创建一些内联数据。

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

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"  ]

【讨论】:

  • 这很酷,虽然对于这一行 SELECT PARSE_JSON('[ {"Name":"John", "Last Name": "Doe"}, {"Name":"Frank", "Last Name": "Doe"}]') 你能不能有一个内部选择来直接从表中填充 PARSE_JSON() 函数的 json 数据,因为你是手动添加在问题中他有值的值存储在列中。所以我在这里看到的是一种使用 SQL 解析 JSON 对象的方法,其方式类似,可以通过任何语言务实地完成。似乎与此处显示的内容有一点差距(除非我遗漏了什么)
  • 对,如果你有一个VARIANT 列,就像 OP 一样,你可以直接从中选择而不是使用 PARSE_JSON
  • 嗨,我没有 Json 列,它是 VarChar 列。
  • OP 有一个VARCHAR 列(基本字符串)而不是VARIANT 列。但是使用您提供的解决方案,只要他可以在 PARSE_JSON 函数中进行内部选择,或者找到一种方法来进行选择并将值作为变量传递给 PARSE_JSON() 函数,它就可以工作。
  • 哦,对了。您不需要内部选择...查看更新的答案。
猜你喜欢
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多