You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Snowflake中无需展开嵌套JSON列表提取指定字段?

Snowflake提取嵌套JSON列表指定键的简化方案

现有如下JSON格式的班级数据:

{
  "class": "history",
  "students": [
      {"first_name": "joe", "last_name": "doe", "age": 16},
      {"first_name": "tony", "last_name": "helen", "age": 10},
      {"first_name": "erica", "last_name": "kran", "age": 12}
  ]
}

{
  "class": "math",
  "students": [
      {"first_name": "joe", "last_name": "no", "age": 16},
      {"first_name": "yo", "last_name": "wha", "age": 18},
      {"first_name": "dan", "last_name": "test", "age": 12}
  ]
}

在Elasticsearch中可直接提取students数组内的first_name属性,结果保留在同一行:

class   | first_name
-------------------------------
history | ['joe', 'tony', 'erica']
math    | ['joe', 'yo', 'dan']

在Snowflake中无需通过展开(flatten)再分组的繁琐方式,以下两种方法可实现需求:

1. 生成指定键值的数组

使用ARRAY_TRANSFORM函数直接对JSON数组做转换,提取目标键的值,无需拆分再聚合。假设数据存储在表class_data的json_col字段中,查询语句如下:

SELECT
    json_col:class::STRING AS class,
    ARRAY_TRANSFORM(json_col:students, s -> s:first_name::STRING) AS first_name
FROM class_data;

执行后会直接返回每行对应的班级名称,以及由first_name组成的字符串数组,输出效果与Elasticsearch一致。

2. 保留仅含指定键的JSON列表

如果需要保留JSON对象结构(仅包含first_name键),可结合OBJECT_CONSTRUCT生成新的JSON数组:

SELECT
    json_col:class::STRING AS class,
    ARRAY_TRANSFORM(json_col:students, s -> OBJECT_CONSTRUCT('first_name', s:first_name)) AS students_first_name
FROM class_data;

输出的students_first_name字段内容为:

[{"first_name":"joe"},{"first_name":"tony"},{"first_name":"erica"}]

内容的提问来源于stack exchange,提问作者yogi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:05:22