2017-09-25 126 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

沒有辦法做到這一點,你必須創建自己的類型。我的回答受到你的榜樣的啓發。你試圖解決什麼問題?也許有一個簡單的方法比最後一個函數的額外參數。 –