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

构建BigQuery动态UNION ALL查询时CONCAT函数报错求助

BigQuery动态合并后缀为client的表报错解决方案

错误原因

报错核心是变量类型不匹配:
当使用FOR table_name IN (SELECT * FROM UNNEST(table_names))时,UNNEST输出的数组元素会被包装成一个STRUCT(默认字段名为f0_),而非直接的STRING类型。CONCAT函数要求所有参数都是STRING或BYTES类型,传入STRUCT后就触发了签名不匹配的错误。

解决方案

方案1:直接引用STRUCT中的字段

修改循环内的table_name为table_name.f0_,明确提取STRING类型的表名字段:

DECLARE query STRING DEFAULT '';
DECLARE table_names ARRAY<STRING>;

SET table_names = (
  SELECT ARRAY_AGG(table_name) AS table_names
  FROM `project.dataset.INFORMATION_SCHEMA.TABLES`
  WHERE table_name LIKE '%client'
);

FOR table_name IN (SELECT * FROM UNNEST(table_names)) DO
  SET query = IF(
    query = '',
    CONCAT('SELECT * FROM `project.dataset.', table_name.f0_, '`'),
    CONCAT(query, ' UNION ALL SELECT * FROM `project.dataset.', table_name.f0_, '`')
  );
END FOR;

EXECUTE IMMEDIATE query;

方案2:优化循环遍历方式

在UNNEST时直接指定别名,让table_name直接成为STRING类型,代码更直观:

DECLARE query STRING DEFAULT '';
DECLARE table_names ARRAY<STRING>;

SET table_names = (
  SELECT ARRAY_AGG(table_name) AS table_names
  FROM `project.dataset.INFORMATION_SCHEMA.TABLES`
  WHERE table_name LIKE '%client'
);

FOR table_name IN (SELECT * FROM UNNEST(table_names) AS table_name) DO
  SET query = IF(
    query = '',
    CONCAT('SELECT * FROM `project.dataset.', table_name, '`'),
    CONCAT(query, ' UNION ALL SELECT * FROM `project.dataset.', table_name, '`')
  );
END FOR;

EXECUTE IMMEDIATE query;

方案3:简化写法(无需FOR循环)

使用ARRAY_TO_STRING直接拼接所有表的查询语句,代码更简洁高效:

DECLARE query STRING;

SET query = (
  SELECT CONCAT(
    'SELECT * FROM `project.dataset.', 
    ARRAY_TO_STRING(ARRAY_AGG(table_name), '` UNION ALL SELECT * FROM `project.dataset.'),
    '`'
  )
  FROM `project.dataset.INFORMATION_SCHEMA.TABLES`
  WHERE table_name LIKE '%client'
);

EXECUTE IMMEDIATE query;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:42:46