【问题标题】:Standard SQL - Not able to loop over main loop标准 SQL - 无法循环主循环
【发布时间】:2023-04-09 00:37:02
【问题描述】:

在 bigquery 中使用嵌套的 LOOP 或 WHILE 循环时,我似乎无法再次遍历外部循环。问题可以用下面的代码重现。

DECLARE i int64 DEFAULT 0;
DECLARE j int64 DEFAULT 0;
DECLARE k int64 DEFAULT 0;
WHILE i < 3 DO
  SET i = i + 1;
  WHILE j < 2 DO
    SET j = j + 1;
    IF j = 2 THEN
      SET k = k+7;
    END IF;
    EXECUTE IMMEDIATE  """
      WITH test AS(SELECT @i2 AS i, @j2 AS j, @k2 AS k)
      SELECT * FROM test
    """
    USING i AS i2, j AS j2, k AS k2;
  END WHILE;
END WHILE;

作为这个的输出,Bigquery 给了我两次迭代(内部循环):

Row i j k
1 1 1 0
Row i j k
1 1 2 7

我希望,当我们结束内部 while 循环时,我们会转到外部循环并重新开始。 以类似的方式结束:

Row i j k
1 2 2 7

这样做的正确方法是什么?当使用相同的设置但具有 LOOP 和 BREAK 条件时,结果与上述说明完全相同。当使用 CONTINUE 而不是 BREAK 时,我的查询将永远运行/一直挂在第二个语句中

【问题讨论】:

    标签: loops while-loop google-bigquery


    【解决方案1】:

    我希望,当我们结束内部 while 循环时,我们会转到外部循环并重新开始

    它实际上完全按照您的预期执行 - 检查这一点 - 在下面运行额外的行,以便您看到证明

    DECLARE i int64 DEFAULT 0;
    DECLARE j int64 DEFAULT 0;
    DECLARE k int64 DEFAULT 0;
    WHILE i < 3 DO
      SET i = i + 1;
      SELECT i; # insert this line to check correctness
      WHILE j < 2 DO
        SET j = j + 1;
        IF j = 2 THEN
          SET k = k+7;
        END IF;
        EXECUTE IMMEDIATE  """
          WITH test AS(SELECT @i2 AS i, @j2 AS j, @k2 AS k)
          SELECT * FROM test
        """
        USING i AS i2, j AS j2, k AS k2;
      END WHILE;
    END WHILE;  
    

    所以,显然 i = 2 - WHILE j &lt; 2 DO 被评估为假,因此被跳过

    这样做的正确方法是什么?

    这取决于您要达到的目标 - 但通常这是通过在第一个循环中重置 j 来完成的,如下例所示

    DECLARE i int64 DEFAULT 0;
    DECLARE j int64 DEFAULT 0;
    DECLARE k int64 DEFAULT 0;
    WHILE i < 3 DO
      SET i = i + 1;
      SET j = 0; # reset j
      WHILE j < 2 DO
        SET j = j + 1;
        IF j = 2 THEN
          SET k = k+7;
        END IF;
        EXECUTE IMMEDIATE  """
          WITH test AS(SELECT @i2 AS i, @j2 AS j, @k2 AS k)
          SELECT * FROM test
        """
        USING i AS i2, j AS j2, k AS k2;
      END WHILE;
    END WHILE;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2021-07-30
      • 2017-11-03
      • 2020-06-30
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      相关资源
      最近更新 更多