首页 > 解决方案 > 如何在 GCP BigQuery 联合查询中使用查询参数

问题描述

我有一个基于 gcp 的环境。我在 gcp BigQuery 和对 cloudsql MySql 的联合查询中使用标准 SQL 脚本。联合查询从 cloudsql mysql 数据库中选择数据。我需要根据取决于 BigQuery 中数据的条件从 cloudsql mysql 数据库中选择数据。我在 gcp bigquery 中使用标准 sql 脚本中的变量来存储我从 bigquery 中选择的值。我想在 mysql 查询的 where 子句中为这个变量赋值。请参阅以下示例,其中我从 BigQuery 中选择一个日期并将其存储在变量“BQ_LAST_DATETIME”中。

    DECLARE BQ_LAST_DATETIME DATETIME
    SET BQ_LAST_DATETIME = (select max(date_created) from bq_my_dataset.bq_my_table);

由于我使用 bigquery 联合查询从 cloudsql 数据库(https://cloud.google.com/bigquery/docs/cloud-sql-federated-queries)中读取数据,如下所示,我想使用我存储的值mysql查询where子句中的变量“BQ_LAST_DATETIME”

   SELECT * FROM EXTERNAL_QUERY("my-gcp-project.my-region.my-connection2-cloudsql", "select * from mysqlschema.mysql_table where where date_created = @BQ_LAST_DATETIME;" );

请注意,在上面的查询中,我使用“@BQ_LAST_DATETIME”作为占位符来显示我想要实现的目标。我不确定是否可以在联合查询的“外部”查询部分直接使用 bigquery 脚本变量作为查询参数。关于如何在联合查询中实现外部查询参数化的任何建议,或者如果您知道我如何实现类似于我的意图的效果?

我实际上尝试了如下所示。我在联合查询的“外部”查询部分使用 bigquery 脚本变量作为查询参数。这里唯一的细微差别是,由于我正在处理日期,因此我执行了强制转换,并且由于日期变量实际上被视为字符串,因此我使用 mysql STR_TO_DATE 将其格式化回日期,如下所示

    DECLARE BQ_LAST_DATETIME DATETIME
    SET BQ_LAST_DATETIME = (select max(date_created) from bq_my_dataset.bq_my_table);
    SET BQ_LAST_DATE= CAST(BQ_LAST_DATETIME  AS DATE);
    SELECT * FROM EXTERNAL_QUERY("my-gcp-project.my-region.my-connection2-cloudsql", "select * from mysqlschema.mysql_table where where date_created =  STR_TO_DATE(@BQ_LAST_DATE,'%Y-%m-%d') ;" );

虽然解析器接受了这个查询,但它没有给出预期的结果。基本上变量@BQ_LAST_DATE 的值似乎并没有按预期到达MySQL 查询。

有谁知道我错过了什么?

非常感谢你的帮助

标签: google-cloud-platformgoogle-bigquery

解决方案


你可以试试EXECUTE IMMEDIATE

DECLARE BQ_LAST_DATETIME STRING;
DECLARE DSQL STRING;
SET BQ_LAST_DATETIME = 'SELECT max(date_created) from bq_my_dataset.bq_my_table';
SET DSQL = '"select * from mysqlschema.mysql_table where date_created = (' || BQ_LAST_DATETIME || ')"';
EXECUTE IMMEDIATE 'SELECT * FROM EXTERNAL_QUERY("my-gcp-project.my-region.my-connection2-cloudsql",' || DSQL || ');'

推荐阅读