【问题标题】:BigQuery load config variables from a tableBigQuery 从表中加载配置变量
【发布时间】:2016-06-01 14:10:16
【问题描述】:

我有一个在单行中定义常量的表。我想通过使用这些常量的值在另一个表上构造一个查询,例如:

从 DataTable WHERE DataTable.key 中选择 DataTable.name > Config.keyConstant

但我不知道如何干净利落地做到这一点。在这种情况下,可以通过使用 CROSS JOIN 来完成

SELECT DataTable.name FROM (DataTable CROSS JOIN Config) WHERE DataTable.key > Config.keyConstant

但是随着我的查询变得越来越大并且需要在不同的地方进行配置,这变得非常混乱。

有什么建议吗?在 SQL 中,我认为您会使用变量来执行此操作。

编辑:其实我希望能够做类似的事情

从数据表中选择 IF(Config.keyConstant*DataTable.key=1, DataTable.name, "John")

这意味着不幸的是,我无法像答案中建议的那样将所有条件逻辑移动到 WHERE EXISTS 子句中(尽管我不知道这一点,这很酷)。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    我认为你的方向是正确的:

    类似下面的内容应该适用于 BigQuery Legacy 和 Standard SQL,并且让 Config 只有一行使得 CROSS JOIN 看起来不那么糟糕。

    SELECT DataTable.name 
    FROM DataTable 
    CROSS JOIN Config
    WHERE DataTable.key1 > Config.key1Constant
      AND DataTable.key2 = Config.key2Constant
      AND DataTable.key3 < Config.key3Constant
    

    在 BigQuery 标准 SQL 中,您可以将其更改为以下内容,这在我看来更具可移植性:

    SELECT
      DataTable.name
    FROM DataTable
    WHERE EXISTS (
      SELECT 1 FROM config
      WHERE DataTable.key1 > key1Constant
        AND DataTable.key2 = key2Constant
        AND DataTable.key3 < key3Constant
    )   
    

    几点注意事项:

    • 成本方面 - 即使配置表很小 - 每次它都会为计费字节贡献额外的 10MB
    • 在 Config 中有额外的列(如 id )将允许您通过调用特定的 id 值来管理要使用的不同版本的常量。或者可以使用基于条件的逻辑来调用所需的常量

    【讨论】:

    • 感谢您的回复 - 我将编辑我的问题,因为我给定的示例已由您的解决方案解决,但我想到的扩展名不是。
    • 这取决于您 - 但我建议不要调整/更改当前问题,而是发布有关您的扩展程序详细信息的新问题
    • 谢谢.. 看起来很相关,值得把它们放在一起。
    • 我最终使用了这样的东西。这有点乱..但它有效:-)所以谢谢。标记为已接受。
    【解决方案2】:

    这是为了回答更新的问题:

    SELECT 
      CASE WHEN Config.keyConstant*DataTable.key=1 
           THEN DataTable.name ELSE "John"
      END as name
    FROM DataTable 
    CROSS JOIN Config
    

    【讨论】:

    • 谢谢 - 这个问题基本上是关于寻找更清洁的解决方案。我有嵌套的子选择等,并且真的想要与变量定义等效的东西。也许这是最好的解决方案。
    • 很遗憾 BigQuery 不支持变量。您可以在这里提交您的案例code.google.com/p/google-bigquery/issues/…
    猜你喜欢
    • 2023-04-07
    • 2022-12-01
    • 2021-08-15
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多