如何在BigQuery中正确使用FOR...IN DO循环执行查询?
解决BigQuery中FOR循环传递表名到FORMAT的类型错误问题
报错的核心原因是:UNNEST(tables)后用SELECT *返回的是STRUCT<f0_ STRING>类型,而FORMAT函数的第二个参数要求是STRING类型,因类型不匹配导致报错。
有两种简单的修正方式:
方法1:直接取UNNEST后的字符串元素
修改FOR循环里的查询,直接提取UNNEST出的字符串,而非用SELECT *:
DECLARE tables ARRAY<STRING>; SET tables = ['table1', 'table2', 'table3']; FOR loop_variable_name IN ( SELECT t FROM UNNEST(tables) AS t ) DO EXECUTE IMMEDIATE FORMAT("""SELECT * FROM dataset.%s WHERE DATE(_PARTITIONTIME) = '2023-06-22' LIMIT 10""", loop_variable_name); END FOR;
方法2:提取STRUCT中的字符串字段
如果保留SELECT *的写法,需要在FORMAT里明确访问STRUCT的f0_字段来获取字符串:
DECLARE tables ARRAY<STRING>; SET tables = ['table1', 'table2', 'table3']; FOR loop_variable_name IN ( SELECT * FROM UNNEST(tables) ) DO EXECUTE IMMEDIATE FORMAT("""SELECT * FROM dataset.%s WHERE DATE(_PARTITIONTIME) = '2023-06-22' LIMIT 10""", loop_variable_name.f0_); END FOR;
两种方法都能解决类型不匹配的问题,推荐第一种,逻辑更清晰,避免依赖自动生成的字段名(比如f0_)。
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

