我可以在表名中使用查询参数吗?

时间:2018-07-23 09:11:36

标签: google-bigquery

我想做以下事情:

SELECT some_things
FROM `myproject.mydataset.mytable_@suffix`

但是这不起作用,因为参数没有在表名中扩展。

使用wildcard tables可以做到

SELECT some_things
FROM `myproject.mydataset.mytable_*`
WHERE _TABLE_SUFFIX = @suffix

但是,它存在一些问题:

  • 如果我输错了参数,此查询将默默返回零行,而不是大声地对我大喊大叫。

  • 使用通配符查询时查询缓存停止工作。

  • 如果存在其他带有mytable_前缀的表,则它们必须具有相同的架构,即使它们与后缀不匹配也是如此。否则,会发生奇怪的事情。看来BigQuery要么计算所有列的并集,要么采用任意表的模式;它没有记录,我也没有详细研究。

是否有更好的方法查询名称取决于查询参数的单个表?

3 个答案:

答案 0 :(得分:1)

为了回答您陈述的问题:

  1. 表扫描在FROM子句中发生,在WHERE子句中发生过滤[1],因此,如果WHERE条件不匹配,将返回空结果。

  2. “当前,使用通配符查询时不支持缓存结果。” [2]。

  3. “ 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