如何在PostgreSQL函数中使用一系列值并以不同的间隔循环

时间:2013-12-16 15:24:26

标签: sql function postgresql loops plpgsql

我有一个非常简单的例子来说明两个数字的总和。

CREATE OR REPLACE FUNCTION add(a integer, b integer) RETURNS integer AS
$$
  SELECT $1+$2;
$$ LANGUAGE 'sql';

我的问题是如何定义范围b 10:20,其值将按1计算,直到达到范围(20)的结尾。

结果是这样的

res = a + b
res = a + 10
res = a + 11
res = a + 12
res = a + 13

当我检索函数add with:

SELECT add(1);

应该有结果:11,12,13,...,21。

之前我没有使用像FOR EACH这样的循环(特别是在LANGUAGE sql中)。

plpgsql中编写这些函数是否更好?

3 个答案:

答案 0 :(得分:0)

我认为您正在寻找功能generate_series(),记录here

所以,

select generate_series(1, 3)

将返回三行:

1
2
3

您可以在算术表达式中使用这些数字。

答案 1 :(得分:0)

select add(1, b)
from generate_series(10, 20) b

答案 2 :(得分:0)

  

之前我没有像FOR EACH那样使用循环(特别是在LANGUAGE sql中)。

SQL中没有循环。 (唯一的例外是RECURSIVE CTEs。)LANGUAGE sql(没有引号!)的函数,仅由SQL语句组成。如果您需要像循环这样的过程元素,则需要切换到PL/pgSQLlooping is easy enough(或任何其他过程语言)。

当然,您提供的简单示例最好用generate_series()解决,正如其他答案已经指出的那样。

请注意:最好在generate_series()列表中使用FROM。允许在SELECT列表中使用它,但不赞成,因为非标准。在将来的版本中,SRF(设置返回函数)可能仅限于FROM列表。