2017-09-25 174 views
2

将额外参数传递给PostgreSQL聚合的最终函数以便为状态值创建特殊类型的唯一方法是?将额外参数传递给PostgreSQL聚合最终函数

例如为:

CREATE TYPE geomvaltext AS (
    geom public.geometry, 
    val double precision, 
    txt text 
); 

然后到使得所述第三参数(文本)最终到达最终的功能使用这种类型的作为状态变量?

为什么聚合不能传递额外的参数给最终的函数呢?任何实施原因?

因此,我们可以很容易地构建,例如,骨料服用方法:

SELECT ST_MyAgg(accum_number, 'COMPUTE_METHOD') FROM blablabla 

感谢

回答

0

你将不得不重新编写最后一个函数本身,而在这种情况下,你还不如写一组新的集合函数,每个可能的集合函数为COMPUTE_METHOD。如果COMPUTE_METHOD是数据值或由数据值隐含,则可以使用CASE语句选择适当的聚合方法。或者,您可能希望创建一个自定义复合类型,其字段为accum_numberCOMPUTE_METHOD,并编写一个使用此新数据类型的新聚合函数。

+0

“COMPUTE_METHOD”是一个文本参数指定如何在最终函数中计算最终结果。问题是将此参数传递给最终函数。显然这是不可能的,除了通过构建包含这个文本参数的新类型,其过于复杂。 – Pierre

1

您可以定义具有多个参数的聚合。

我不知道是否能解决你的问题,但你可以使用这样的:

CREATE OR REPLACE FUNCTION myaggsfunc(integer, integer, text) RETURNS integer 
    IMMUTABLE STRICT LANGUAGE sql AS 
$f$ 
    SELECT CASE $3 
      WHEN '+' THEN $1 + $2 
      WHEN '*' THEN $1 * $2 
      ELSE NULL 
     END 
$f$; 

CREATE AGGREGATE myagg(integer, text) (
    SFUNC = myaggsfunc(integer, integer, text), 
    STYPE = integer 
); 

它可以这样来使用:

CREATE TABLE mytab 
    AS SELECT * FROM generate_series(1, 10) i; 

SELECT myagg(i, '+') FROM mytab; 

myagg 
------- 
    55 
(1 row) 

SELECT myagg(i, '*') FROM mytab; 

    myagg 
--------- 
3628800 
(1 row) 
+0

关键是“如何将其他参数传递给最终函数?”。将它们传递给状态函数很容易。 – Pierre

+0

没有办法做到这一点,你必须创建自己的类型。我的回答受到你的榜样的启发。你试图解决什么问题?也许有一个简单的方法比最后一个函数的额外参数。 –