我想做以下事情:
SELECT some_things
FROM `myproject.mydataset.mytable_@suffix`
但是这不起作用,因为参数没有在表名中扩展。
使用wildcard tables可以做到 :
SELECT some_things
FROM `myproject.mydataset.mytable_*`
WHERE _TABLE_SUFFIX = @suffix
但是,它存在一些问题:
如果我输错了参数,此查询将默默返回零行,而不是大声地对我大喊大叫。
使用通配符查询时查询缓存停止工作。
如果存在其他带有mytable_
前缀的表,则它们必须具有相同的架构,即使它们与后缀不匹配也是如此。否则,会发生奇怪的事情。看来BigQuery要么计算所有列的并集,要么采用任意表的模式;它没有记录,我也没有详细研究。
是否有更好的方法查询名称取决于查询参数的单个表?
答案 0 :(得分:1)
为了回答您陈述的问题:
表扫描在FROM子句中发生,在WHERE子句中发生过滤[1],因此,如果WHERE条件不匹配,将返回空结果。
“当前,使用通配符查询时不支持缓存结果。” [2]。
“ BigQuery将该模式用于与通配符匹配的最近创建的表作为模式” [3]。您在用例中遇到了什么奇怪的事情? “通配符表表示与通配符表达式匹配的所有表的并集” [4]。
在BigQuery中,可以运行参数化查询,但是不能对表名进行参数化[5]。通配符解决方案似乎是唯一的方法。
答案 1 :(得分:1)
是的,你可以,这是一个有效的例子:
DECLARE tablename STRING;
DECLARE tableQuery STRING;
##get list of tables
CREATE TEMP TABLE tableNames as select table_name from nomo_nausea.INFORMATION_SCHEMA.TABLES where table_name not in ('_sdc_primary_keys', '_sdc_rejected', 'fba_all_order_report_data');
WHILE (select count(*) from tableNames) >= 1 DO
SET tablename = (select table_name from tableNames LIMIT 1);
##build dataset + table name
SET tableQuery = CONCAT('nomo_nausea.' , tablename);
##use concat to build string and execute
EXECUTE IMMEDIATE CONCAT('SELECT * from `', tableQuery, '` where _sdc_deleted_at is not null');
DELETE FROM tableNames where table_name = tablename;
END WHILE;
答案 2 :(得分:0)
如果您使用 Python API ,则实际上可以将表用作参数,但尚未记录。如果您通过格式化的文本字符串和文档字符串将表作为参数传递,则查询应该可以正常工作。
SQL示例:
sql = "SELECT max(_last_updt) FROM `{0}.{1}.{2}` WHERE _last_updt >= TIMESTAMP(" +
"CURRENT_DATE('-06:00'))".format(project_id, dataset_name, table_name)
在Python API上下文中的SQL:
bigquery_client = bigquery.Client() #setup the client
query_job = bigquery_client.query(sql) #run the query
results = query_job.result() # waits for job to complete
for row in results:
print row