使用 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 问题跟踪器上添加功能请求
一个选项是,如果您知道特定的 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。
当查询带有日期分区后缀的 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 问题跟踪器上添加功能请求
一个选项是,如果您知道特定的 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。