调试带有变量的BigQuery联邦查询

bf1o4zei  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(173)

因此,我正在尝试在BigQuery中为我的表构建一个增量更新系统,其源代码为Cloud SQL MySQL数据库。为此,我使用联邦查询,并且我想查询在某个时间戳之后更新的数据。

我的查询基于这个问题的答案:如何在GCP BigQuery联邦查询中使用查询参数

要获得以下信息:

DECLARE BQ_LAST_DATETIME STRING;
DECLARE DSQL STRING;
SET BQ_LAST_DATETIME = "SELECT MAX(updated_at) FROM `dataset.table`";
SET DSQL = '"SELECT * FROM mysql_table WHERE updated_at > ('|| BQ_LAST_DATETIME ||')"';
EXECUTE IMMEDIATE 'SELECT * FROM EXTERNAL_QUERY("mygcpproject.region.database",'|| DSQL||');'

这不起作用,因为设置BQ_LAST_DATETIME的BigQuery查询正在MySQL中运行,因此找不到该表。

因此,我发现您必须评估第一个选择,这导致了以下结果:

DECLARE BQ_LAST_DATETIME TIMESTAMP;
DECLARE DSQL STRING;
SET BQ_LAST_DATETIME = (SELECT MAX(updated_at) FROM `dataset.table`);
SET DSQL = '"SELECT * FROM mysql_table WHERE updated_at > ('|| BQ_LAST_DATETIME ||')"';
EXECUTE IMMEDIATE 'SELECT * FROM EXTERNAL_QUERY("mygcpproject.region.database",'|| DSQL||');'

这也不起作用,因为查询将包含如下内容:

SELECT * FROM mysql_table WHERE updated_at > 16-09-2022 15:25:00

它应该在哪里:

SELECT * FROM mysql_table WHERE updated_at > '16-09-2022 15:25:00'

有人知道怎么做吗?非常感谢你的帮助

alen0pnh

alen0pnh1#

您可以尝试以下方法之一:

1.使用转义引号(')而不是()

SET DSQL = '"SELECT * FROM mysql_table WHERE updated_at > ''|| BQ_LAST_DATETIME ||''"';

1.在**Format()**函数中使用带三引号的格式化字符串"""

EXECUTE IMMEDIATE FORMAT("""
  SELECT * FROM EXTERNAL_QUERY(
    "mygcpproject.region.database",
    "SELECT * FROM mysql_table WHERE updated_at > '%s'"
  );
""", STRING(BQ_LAST_DATETIME));

相关问题