使用 table 通配符函数时,标准 SQL 不会为不存在的 table 引发异常

Standard SQL not raising exceptions for non-existing tables when using table wildcard function

当查询带有日期分区后缀的 tables 时,我们有旧式 SQL 和标准 SQL 的通配符功能。但是,我发现它们的工作方式并不完全相同,即使特定日期的 table 不存在,标准 SQL 也不会引发异常。

例如,我有一组 table 称为 myTable_YYYYMMDD,但缺少 table 'myTable_20170601',然后

旧版 SQL,

 Select *
 From table_date_range([project_id:datasetName.myTable_],
 timestamp('20170601'), timestamp('20170601'))

它会给我 [错误: 查询:带有 table 通配符的 FROM 子句不匹配 table(错误代码:invalidQuery) ]

在标准查询中,

Select *
From `project_id.datasetName.myTable_*`
where _table_suffix between '20170601' and '20170601'

即使 table 不可用,这也会给我一个空结果而不是异常。

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

是否也可以在标准 SQL 中引发异常?

提前谢谢你。


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

https://issuetracker.google.com/issues/62264827

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

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 日的 table 不存在,查询将失败。或者,如果通过除法 _TABLE_SUFFIX 的数量为零,则可以触发失败:

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;

编辑:如果还有人想关注海鹏的功能需求,可以找in the issue tracker