我想创建一个函数,它将初始条件作为参数,并使用一组值来计算最终结果。在我的特定情况下(与PostGIS中的几何处理有关),重要的是集合中的每个成员一次一个地处理当前(可能是初始)状态以保持结果清洁。 (我需要处理条子和间隙问题,并且除了一次一个元素之外,还有很难做到这一点。)我需要做的处理已经被定义为一个带有两个适当参数的函数(其中第一个可以是当前状态,第二个可以是集合中的值。
所以我想要一些与你期望的相似的东西:
SELECT my_func('some initial condition', my_table.some_column) FROM my_table;
聚合似乎很适合这个,但我无法弄清楚如何让函数接受初始状态。 PL / pgSQL中的迭代方法非常简单:
CREATE FUNCTION my_func(initial sometype, values sometype[])
-- Returns, language, etc.
AS $$
DECLARE
current sometype := initial;
v sometype;
BEGIN
FOREACH v IN ARRAY values LOOP
current := SomeBinaryOperation(current, v);
END LOOP;
RETURN current;
END
$$
但是需要手动将值滚动到数组中:
SELECT my_func('some initial condition', ARRAY_AGG(my_table.some_column)) FROM my_table;
您可以创建具有多个参数的聚合,但第一个参数后面的参数将用作转换函数的附加参数。我看不出其中任何一个可能变成初始状态。 (至少没有一个非常hacky函数,如果第一个参数是NULL或类似的话,它将第三个参数视为初始条件。并且仅当聚合参数可以是常量而不是列时。)
我最好只使用PL / pgSQL迭代方法,还是有办法创建一个接受其初始条件作为参数的聚合?还是有什么我没有想过的?
目前我正在使用PostgreSQL 9.3,但如果有新内容可以帮助升级可能是一种选择。