2017-09-25 11 views
2

PostgreSQL集約の最終関数に余分なパラメータを渡して状態値の特殊なTYPEを作成する唯一の方法はありますか?PostgreSQL集約最終関数に余分なパラメータを渡す

例えば:

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

3番目のパラメータ(テキスト)は、最終的に最終的な機能に到達するように、状態変数として、このタイプを使用しますか?

なぜ集約関数は最終関数自体に余分なパラメータを渡すことができないのですか?実装上の理由は?

だから我々は簡単に、たとえば、方法を取って集約し、構築することができます:

SELECT ST_MyAgg(accum_number, 'COMPUTE_METHOD') FROM blablabla 

おかげ

答えて

0

をあなたは、最終的な関数自体を書き換えなければならないだろう、その場合にはあなたにも書くかもしれません新しい集計関数のセットは、可能なそれぞれのために1つのCOMPUTE_METHODです。 COMPUTE_METHODがデータ値であるか、データ値で暗黙指定されている場合は、CASE文を使用して適切な集計メソッドを選択できます。また、accum_numberCOMPUTE_METHODのフィールドを持つカスタムコンポジット型を作成し、この新しいデータ型を使用する新しい集約関数を1つ作成することもできます。

+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

これを行う方法はありません。独自のタイプを作成する必要があります。私の答えは、あなたの例に触発されました。あなたが解決しようとしている問題は何ですか?おそらく、最終的な関数に対する余分な引数よりも簡単な方法があります。 –

関連する問題