Google bigquery 标准SQL在使用表通配符函数时不引发不存在表的异常

Google bigquery 标准SQL在使用表通配符函数时不引发不存在表的异常,google-bigquery,google-cloud-sql,bigquery-standard-sql,Google Bigquery,Google Cloud Sql,Bigquery Standard Sql,当查询带有日期分区后缀的表时,我们为遗留SQL和标准SQL都提供了通配符函数。但是,我发现它们的工作方式并不完全相同,即使特定日期的表不存在,标准SQL也不会引发异常 例如,我有一组名为myTable_YYYYMMDD的表,但缺少表'myTable_20170601',然后 在旧式SQL中 Select * From table_date_range([project_id:datasetName.myTable_], timestamp('20170601'), timestamp('2

当查询带有日期分区后缀的表时,我们为遗留SQL和标准SQL都提供了通配符函数。但是,我发现它们的工作方式并不完全相同,即使特定日期的表不存在,标准SQL也不会引发异常

例如,我有一组名为
myTable_YYYYMMDD
的表,但缺少表'myTable_20170601',然后

在旧式SQL中

 Select *
 From table_date_range([project_id:datasetName.myTable_],
 timestamp('20170601'), timestamp('20170601'))
它会给我[错误: 查询:带有表通配符的FROM子句不匹配任何表(错误代码:invalidQuery)]

在标准查询中,

Select *
From `project_id.datasetName.myTable_*`
where _table_suffix between '20170601' and '20170601'
这将给我一个空结果,而不是异常,即使该表不可用

在这种情况下,如果我正在运行一个自动作业来再次查询表,并且空表也是预期结果之一,那么我就不会知道源表不存在,这会影响实际结果

这是否也可能在标准SQL中引发异常

先谢谢你


在BigQuery问题跟踪器上添加功能请求


一个选项是,如果您知道某个特定的表应该存在,您可以只查询该表,或者与该表合并(如果您要查询多个日期)。例如:

SELECT *
FROM `project_id.datasetName.myTable_20170601`;
或者,对于多个日期:

SELECT *
FROM `project_id.datasetName.myTable_20170601` UNION ALL
(SELECT *
 FROM `project_id.datasetName.myTable_*`
 WHERE _TABLE_SUFFIX BETWEEN '20170516' AND '201706531');
无论哪种情况,如果6月1日的表不存在,查询都将失败。或者,如果
\u TABLE\u后缀
的数量通过除法为零,则可以触发故障:

WITH T AS (
  SELECT *, _TABLE_SUFFIX AS suffix
  FROM `project_id.datasetName.myTable_*`
  WHERE _TABLE_SUFFIX BETWEEN '20170601' AND '20170601'
)
SELECT
  * EXCEPT(suffix),
  1 / (SELECT COUNT(DISTINCT suffix) FROM T)
FROM T;

编辑:如果其他任何人想要遵循海鹏的功能要求,您可以找到它。

嗨,Elliott,这绝对是一个旁路解决方案。但是,对于自动化作业,我根据日期字符串查询一天的表,然后将其传递给Datalab中的查询。那么解决方案#1将不起作用,因为我无法将表名本身传递给SQL magic cell。对于解决方案#3,对于针对每日表的每个查询,我必须添加额外的步骤来验证表的存在性,这虽然有效,但总是不美观。这是否意味着标准SQL不会像传统SQL那样检查表是否存在?或者可能是功能请求?非常感谢您,Elliott。WHERE子句只排除行——因为排除了所有行而导致查询失败是没有意义的。你可以考虑一个可以触发错误的函数,谢谢。新的查询应该按照预期工作。提交一个功能请求可能是一个更好的主意。我会接受你的回答,并在Google Issue Tracker上添加一个功能请求。