我正在尝试遍历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;
所需的输出为:
x = 10
x = 17
x = 24
x = 31
x = 38
x = 45
x = 52
x = 59
但是我却得到:
x = 70
x = 77
x = 84
x = 91
以此类推...
关于我将如何执行此操作的任何想法?预先感谢您的帮助!
答案 0 :(得分:7)
不幸的是,for-loop不允许您指定增量,而只能指定迭代次数。
您的代码正在10到59之间的每个整数上循环,因此您将循环执行了50次,其中i
设置为10、11,...,58、59;然后对于每次迭代,您将i
的值乘以7-因此,您将获得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.
您可以使用更多变量来避免重复自己的步骤:
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;
/
您为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.
或使用递归子查询分解:
with rcte (result) as (
select 10
from dual
union all
select result + 7
from rcte
where result < 59
)
select result
from rcte;