【问题标题】:How can I insert variables into BigQuery query strings using App Script?如何使用应用脚本将变量插入 BigQuery 查询字符串?
【发布时间】:2021-02-25 06:59:57
【问题描述】:

我遇到了一个问题,我无法在谷歌的任何地方找到或找到解决方案。

我在 BigQuery 中有一个表,其中包含 150k 多个唯一行和 29 列。
每行都有一个REQUIREDdateX 类型DATE

在我的应用程序脚本中,我从电子表格(最重要的是日期范围)中获取用户输入,在指定文件夹中创建新电子表格,插入数据和设置格式,并将下载链接返回给用户。

我需要的“最终”功能是能够获取用户提供的日期范围值并将它们插入到我的 BigQuery 查询字符串中,这样我就可以只为这些日期写入 BigQuery 表中的数据。

问题:
无论我如何在 App Script 中构造查询字符串,查询 不会 返回任何行。只是标题。
到目前为止,我已经确定查询中的WHERE 语句是问题所在。我尝试了以下方法:

var request = {
    query: `SELECT * FROM le.table.name WHERE dateX = '2020-10-5'`
};
//
// Some of the variations I've tried (among countless others w/ different formatting):
// 'SELECT * FROM le.table.name WHERE dateX = "2020-10-5"'
// "SELECT * FROM le.table.name WHERE dateX = '2020-10-5'"
// 'SELECT * FROM le.table.name WHERE dateX between "2020-10-5" and "2020-10-5"'
// 'SELECT * FROM le.table.name WHERE cast(dateX as date) between "2020-10-5" and "2020-10-5"'
// `SELECT * FROM le.table.name WHERE dateX = ${dateFrom}`
// `SELECT * FROM le.table.name WHERE dateX between ${dateFrom} and ${dateTo}`
//
// I've also tried setting the query string as a variable & passing with no success. 
// var queryString = 'SELECT * FROM le.table.name WHERE dateX = "2020-10-5"';
// var queryString = 'SELECT * FROM le.table.name WHERE dateX = ' + '2020-10-5';

所有这些都运行良好。作业执行没有错误。但它只返回标题,没有行:(
当我直接在 BigQuery 中运行时,相同的查询运行良好并返回所需的行。

此外,如果我从 WHERE 开始删除所有内容,它会运行我的所有 150k+ 行的查询。
如果我选择我的列,它会返回所需的列。但不会返回 ALL (*)。

我非常困惑,真的迷路了。也许我在这方面花了很多时间,我已经形成了一种隧道视野,需要第二双眼睛来发现这个问题。任何帮助是极大的赞赏。提前谢谢你。

【问题讨论】:

    标签: javascript mysql google-apps-script google-cloud-platform google-bigquery


    【解决方案1】:

    如果没有示例数据,我不确定我还能说什么。如果可能 - 也许您可以分享您的数据集的一些匿名版本?

    我的猜测是一个简单的错字:

    var request = {
        query: `SELECT * FROM le.table.name WHERE dateX = '2020-10-5'`
    };
    

    不应该是'2020-10-05'吗?

    【讨论】:

    • 额外的整数并没有什么不同,因为 BigQuery 似乎足够聪明,可以正确解释任一变体(2020-10-05 / 2020-10-5)。但我同意第二个整数应该包含在日期中,因为它的格式相同。
    【解决方案2】:

    我在这个问题上睡了一觉,找到了解决问题的方法:

    直接在 BigQuery 中运行查询时,它足够聪明地知道“2020-10-05”实际上是一个日期,因此它以DATE 格式读取它。

    在App Script中构造查询字符串时,整个this是一个String,因此'2020-10-05'也是一个字符串。这显然会导致 WHERE 返回 false,因为它将 dateXDATE)与 String 进行比较。
    这可以通过在日期变量上使用cast() 来解决:

    var request = {
        query: `SELECT * FROM le.table.name WHERE dateX between ` + 
               `cast(${dateFrom} as date) and cast(${dateTo} as date);`
    }  
    //
    //Note: dateFrom & dateTo variables need to include ' ' in them.
    //  Ex: var dateFrom = "'2020-10-05'";
    //
    

    我希望这可以帮助其他处理 App Script 和 BigQuery 的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2021-09-02
      • 2017-02-24
      相关资源
      最近更新 更多