bigquery中的表是按timestamp列划分的,我编写了一个简单的过程,可以很好地工作。
在这里:
CREATE PROCEDURE DATASET_ID.TEST(from_timestamp timestamp, to_timestamp timestamp)
BEGIN
SELECT
*
FROM
DATASET_ID.TABLE_ID
WHERE
timestamp>=from_timestamp and timestamp<=to_timestamp;
END;
现在,当我添加更多过滤器时,bigquery抛出错误。
使用更多过滤器的步骤:
CREATE PROCEDURE DATASET_ID.TEST(from_timestamp timestamp, to_timestamp timestamp)
BEGIN
SELECT
*
FROM
DATASET_ID.TABLE_ID
WHERE
timestamp>=from_timestamp and timestamp<=to_timestamp
and app_id="xyz";
END;
``` `Error validating procedure body (add OPTIONS(strict_mode=false) to suppress): Query error: Query error: Cannot query over table ' DATASET_ID.TABLE_ID' without a filter over column(s) 'timestamp' that can be used for partition elimination at [3:3]` 向存储过程中的where子句添加更多筛选器的最佳方法是什么?
1条答案
按热度按时间5jdjgkvh1#
根据文档,当您有一个分区表时,您需要指定要查询的分区。
除此之外
CREATE PROCEDURE
具有可选标志[strict_mode][2]
,其中:如果设置为
TRUE
:过程主体将接受额外的错误检查,例如不存在的表或列。如果主体未通过任何这些检查,create procedure语句将失败。
如果设置为
FALSE
:只检查过程主体的语法。递归调用自身的过程应使用strict\ mode=false来创建,以避免由于验证过程时尚未存在的过程而导致的错误
默认设置为
TRUE
.我可以用时间戳分区表复制您的案例,创建过程并在
WHERE
子句成功。下面是我用过的table。表按字段进行分区
_time
这是一个TIMESTAMP
.为了创建具有时间范围的过程,我使用了between操作符。然后在存储之后,我添加了一个额外的过滤器
dummy_column="d"
. 最终程序如下:注意,我在where子句中使用了两个过滤器。之后,调用以下过程:
以及输出,
如上所示,它在
strict_mode=TRUE
(默认)。但是,当设置为FALSE
,它将产生相同的输出,而不会产生任何错误。语法如下:因此,如果您按照上面的说明操作,您应该不会发现任何错误。