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

在BigQuery中从动态JSON对象数组提取指定name键值

在BigQuery中动态提取JSON数组里的所有name字段值

问题场景

给定如下JSON数据:

{
  "actors": {
    "stooges": [
      {
        "id": 1,
        "name": "Larry"
      },
      {
        "id": 2,
        "name": "Curly"
      },
      {
        "id": 3,
        "name": "Moe"
      }
    ]
  }
}

需要提取所有stooges数组中的name字段值,得到结果["Larry", "Curly", "Moe"]。但原有指定索引的JSON_EXTRACT写法(如下)无法适配数组大小动态变化的场景:

-- Declaring a bigQuery variable 
DECLARE json_data JSON DEFAULT (SELECT PARSE_JSON('{ "actors": {"stooges": [{"id": 1,"name": "Larry"},{"id": 2,"name": "Curly"},{"id": 3,"name": "Moe"}]}}'));

-- Select statement. But this is no good for my use case since I don't want to specify element index ([0]) as the array size is dynamic
SELECT JSON_EXTRACT(json_data, '$.actors.stooges[0].name');

可行解决方案

方法一:数组展开+聚合

通过提取整个数组、展开元素、提取字段再聚合的方式,适配任意长度的数组:

DECLARE json_data JSON DEFAULT (SELECT PARSE_JSON('{ "actors": {"stooges": [{"id": 1,"name": "Larry"},{"id": 2,"name": "Curly"},{"id": 3,"name": "Moe"}]}}'));

SELECT ARRAY_AGG(JSON_EXTRACT_SCALAR(stooge, '$.name')) AS names
FROM UNNEST(JSON_EXTRACT_ARRAY(json_data, '$.actors.stooges')) AS stooge;
  • JSON_EXTRACT_ARRAY:提取$.actors.stooges对应的完整JSON数组
  • UNNEST:将数组拆分为多行记录,每个数组元素对应一行
  • JSON_EXTRACT_SCALAR:从单个元素中提取name的纯字符串值(避免返回带引号的JSON格式字符串)
  • ARRAY_AGG:将分散的name值重新聚合为目标数组

方法二:直接使用JSON路径通配符

利用BigQuery的JSON_QUERY_ARRAY函数,结合[*]通配符匹配数组所有元素,一步到位提取目标数组:

DECLARE json_data JSON DEFAULT (SELECT PARSE_JSON('{ "actors": {"stooges": [{"id": 1,"name": "Larry"},{"id": 2,"name": "Curly"},{"id": 3,"name": "Moe"}]}}'));

SELECT JSON_QUERY_ARRAY(json_data, '$.actors.stooges[*].name') AS names;
  • 路径中的[*]会匹配数组的每一个元素,直接提取所有元素的name字段,返回结果就是["Larry", "Curly", "Moe"],写法更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:15:42