如何在SQL中以不同的增量遍历数字

Luk*_*rth 4 oracle plsql

我试图遍历SQL中的数字,这些数字的起始值是10,然后递增7的值,直到59。在基于C的语言中,这将非常简单,但是我在Oracle中实现它时遇到了麻烦SQL。

我尝试过使用for循环并将每个迭代乘以7,但是对于如何在特定值处开始和结束循环感到困惑。

DECLARE
incrementor PLS_INTEGER := 7;
BEGIN
    FOR i IN 10..59 LOOP
        dbms_output.put_line('x = '|| i * incrementor);
    END loop;
END;
Run Code Online (Sandbox Code Playgroud)

所需的输出将是:

x = 10
x = 17
x = 24
x = 31
x = 38
x = 45
x = 52
x = 59
Run Code Online (Sandbox Code Playgroud)

但是相反,我得到了:

x = 70
x = 77
x = 84
x = 91
Run Code Online (Sandbox Code Playgroud)

等等...

关于如何执行此操作的任何想法?在此先感谢您的帮助!

Ale*_*ole 7

for循环不允许你指定的增量,遗憾的是,只有迭代次数。

您的代码将遍历10到59之间的每个整数,因此您将循环遍历了50次,i设置为10、11,...,58、59; 然后对于每次迭代,您将该值乘以i7-因此您获得的50个结果的值分别为70、77,...,406、413。

要获得所需的结果,您可以计算所需的实际迭代次数,然后将范围起始值添加到循环内的乘法结果中:

DECLARE
    incrementor PLS_INTEGER := 7;
BEGIN
    FOR i IN 0..floor((59 - 10)/incrementor) LOOP
        dbms_output.put_line('x = '|| (10 + i * incrementor));
    END loop;
END;
/

x = 10
x = 17
x = 24
x = 31
x = 38
x = 45
x = 52
x = 59


PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用更多变量以避免重复:

DECLARE
    incrementor PLS_INTEGER := 7;
    low_value PLS_INTEGER := 10;
    high_value PLS_INTEGER := 59;
BEGIN
    FOR i IN 0..floor((high_value - low_value)/incrementor) LOOP
        dbms_output.put_line('x = '|| (low_value + i * incrementor));
    END loop;
END;
/
Run Code Online (Sandbox Code Playgroud)

您为PL / SQL标记了问题,这就是您尝试中所使用的。但正如您的问题是指SQL一样;您可以使用分层查询在普通SQL中执行此操作:

select 10 + (7 * (level - 1)) as result
from dual
connect by level <= floor((59 - 10)/7) + 1;

    RESULT
----------
        10
        17
        24
        31
        38
        45
        52
        59

8 rows selected. 
Run Code Online (Sandbox Code Playgroud)

或使用递归子查询分解:

with rcte (result) as (
  select 10
  from dual
  union all
  select result + 7
  from rcte
  where result < 59
)
select result
from rcte;
Run Code Online (Sandbox Code Playgroud)