1

在查询带有日期分区后缀的表时,我们对 Legacy SQL 和 Standard 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 问题跟踪器上添加功能请求

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

4

1 回答 1

3

一种选择是,如果您知道应该存在一个特定的表,您可以只查询该表或与它进行联合(如果您要查询多个日期)。例如:

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_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;

编辑:如果其他人想关注海鹏的功能请求,您可以在问题跟踪器中找到它。

于 2017-06-01T17:06:34.887 回答