sql`where`子句?

bpsygsoo  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(478)

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子句添加更多筛选器的最佳方法是什么?
5jdjgkvh

5jdjgkvh1#

根据文档,当您有一个分区表时,您需要指定要查询的分区。
除此之外 CREATE PROCEDURE 具有可选标志 [strict_mode][2] ,其中:
如果设置为 TRUE :
过程主体将接受额外的错误检查,例如不存在的表或列。如果主体未通过任何这些检查,create procedure语句将失败。
如果设置为 FALSE :
只检查过程主体的语法。递归调用自身的过程应使用strict\ mode=false来创建,以避免由于验证过程时尚未存在的过程而导致的错误
默认设置为 TRUE .
我可以用时间戳分区表复制您的案例,创建过程并在 WHERE 子句成功。下面是我用过的table。

Row _time                   dummy_column
1   2020-06-15 23:57:00 UTC a
2   2020-06-15 23:58:00 UTC b
3   2020-06-15 23:59:00 UTC c
4   2020-06-16 00:00:00 UTC d
5   2020-06-16 00:00:01 UTC e
6   2020-06-16 00:00:02 UTC f

表按字段进行分区 _time 这是一个 TIMESTAMP .
为了创建具有时间范围的过程,我使用了between操作符。然后在存储之后,我添加了一个额外的过滤器 dummy_column="d" . 最终程序如下:

CREATE OR REPLACE PROCEDURE `project_id.dataset.procedure`(from_ts TIMESTAMP, to_ts TIMESTAMP)
BEGIN
  select *
  from `project_id.dataset.partitioned_table` 
  where _time BETWEEN from_ts and to_ts and dummy_column="d";
END;

注意,我在where子句中使用了两个过滤器。之后,调用以下过程:

DECLARE from_ts TIMESTAMP DEFAULT TIMESTAMP("2008-12-25 05:30:00+00");
DECLARE to_ts TIMESTAMP DEFAULT TIMESTAMP("2020-12-25 05:30:00+00");
CALL `test-proj-261014.sample.test`(from_ts, to_ts);

以及输出,

Row _time                   dummy_column    
1   2020-06-16 00:00:00 UTC d

如上所示,它在 strict_mode=TRUE (默认)。但是,当设置为 FALSE ,它将产生相同的输出,而不会产生任何错误。语法如下:

CREATE OR REPLACE PROCEDURE `project_id.dataset.procedure`(from_ts TIMESTAMP, to_ts TIMESTAMP)
OPTIONS(strict_mode=FALSE)
BEGIN
  select *
  from `project_id.dataset.partitioned_table` 
  where _time BETWEEN from_ts and to_ts and dummy_column="d";
END;

因此,如果您按照上面的说明操作,您应该不会发现任何错误。

相关问题