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

如何在BigQuery中动态提取JSON数组生成公司ID列?

BigQuery动态生成JSON数组对应列展示公司ID

输入JSON示例

{
    "type": "list",
    "data": [
        {
            "id": "5bc7a3396fbc71aaa1f744e3",
            "type": "company",
            "url": "/companies/5bc7a3396fbc71aaa1f744e3"
        },
        {
            "id": "5b0aa0ac6e378450e980f89a",
            "type": "company",
            "url": "/companies/5b0aa0ac6e378450e980f89a"
        }
    ],
    "url": "/contacts/5802b14755309dc4d75d184d/companies",
    "total_count": 2,
    "has_more": false
}

目标输出

company_0company_1
5bc7a3396fbc71aaa1f744e35b0aa0ac6e378450e980f89a

实现方案

由于需要根据数组长度动态生成列,需结合UNNEST(带偏移量)和EXECUTE IMMEDIATE动态SQL实现:

场景1:JSON存储在表字段中

假设表名为your_table,JSON字段名为json_data,执行以下SQL:

DECLARE cols STRING;

-- 生成动态列的聚合语句
SET cols = (
  SELECT STRING_AGG(DISTINCT CONCAT('MAX(IF(offset = ', offset, ', id, NULL)) AS company_', offset), ', ')
  FROM your_table,
  UNNEST(JSON_EXTRACT_ARRAY(json_data, '$.data')) WITH OFFSET AS offset
);

-- 动态执行透视查询
EXECUTE IMMEDIATE CONCAT('
  SELECT ', cols, '
  FROM (
    SELECT 
      JSON_VALUE(item, ''$.id'') AS id,
      offset
    FROM your_table,
    UNNEST(JSON_EXTRACT_ARRAY(json_data, ''$.data'')) WITH OFFSET AS offset,
    UNNEST([item]) AS item
  )
  GROUP BY TRUE
');

场景2:直接使用JSON字符串

如果是单条JSON字符串,可直接传入处理:

DECLARE json_str STRING DEFAULT '''{
    "type": "list",
    "data": [
        {
            "id": "5bc7a3396fbc71aaa1f744e3",
            "type": "company",
            "url": "/companies/5bc7a3396fbc71aaa1f744e3"
        },
        {
            "id": "5b0aa0ac6e378450e980f89a",
            "type": "company",
            "url": "/companies/5b0aa0ac6e378450e980f89a"
        }
    ],
    "url": "/contacts/5802b14755309dc4d75d184d/companies",
    "total_count": 2,
    "has_more": false
}''';

DECLARE cols STRING;

SET cols = (
  SELECT STRING_AGG(DISTINCT CONCAT('MAX(IF(offset = ', offset, ', id, NULL)) AS company_', offset), ', ')
  FROM UNNEST(JSON_EXTRACT_ARRAY(json_str, '$.data')) WITH OFFSET AS offset
);

EXECUTE IMMEDIATE CONCAT('
  SELECT ', cols, '
  FROM (
    SELECT 
      JSON_VALUE(item, ''$.id'') AS id,
      offset
    FROM UNNEST(JSON_EXTRACT_ARRAY(json_str, ''$.data'')) WITH OFFSET AS offset,
    UNNEST([item]) AS item
  )
  GROUP BY TRUE
');

关键逻辑说明

  1. JSON_EXTRACT_ARRAY提取JSON中的data数组,UNNEST ... WITH OFFSET为每个数组元素添加索引(0、1...)。
  2. JSON_VALUE从每个数组元素中取出公司ID。
  3. 通过STRING_AGG拼接出动态列的聚合表达式,再用EXECUTE IMMEDIATE执行动态生成的透视SQL,实现按索引生成对应列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:39:53