2017-09-25 1 views
2

Ist die einzige Möglichkeit, einen zusätzlichen Parameter an die endgültige Funktion eines PostgreSQL-Aggregats zu übergeben, um einen speziellen TYPE für den Statuswert zu erstellen?Übergeben Sie zusätzliche Parameter an PostgreSQL-Aggregat-Endfunktion

z.B .:

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

Und dann diese Art als die Zustandsvariablen zu verwenden, so dass der dritte Parameter (Text) schließlich die endgültige Funktion erreicht?

Warum können Aggregate keine zusätzlichen Parameter an die endgültige Funktion selbst übergeben? Jeder Implementierungsgrund?

So konnten wir leicht konstruieren, zum Beispiel Aggregate nehmen eine Methode:

SELECT ST_MyAgg(accum_number, 'COMPUTE_METHOD') FROM blablabla 

Dank

Antwort

0

Sie würden die letzte Funktion selbst, und in diesem Fall müssen neu schreiben könnten Sie auch eine schreiben Satz neuer Aggregatfunktionen, eine für jede mögliche COMPUTE_METHOD. Wenn COMPUTE_METHOD ein Datenwert ist oder durch einen Datenwert impliziert wird, kann eine CASE-Anweisung verwendet werden, um die entsprechende Aggregatmethode auszuwählen. Alternativ können Sie einen benutzerdefinierten zusammengesetzten Typ mit Feldern für accum_number und COMPUTE_METHOD erstellen und eine einzelne neue Aggregatfunktion schreiben, die diesen neuen Datentyp verwendet.

+0

„COMPUTE_METHOD“ ist ein Textparameter Festlegen, wie das Endergebnis in der endgültigen Funktion berechnet werden muss. Das Problem besteht darin, diesen Parameter an die endgültige Funktion zu übergeben. Scheinbar ist dies nicht anders möglich als durch das Erstellen eines neuen Typs, der diesen Textparameter umfasst, der zu kompliziert ist. – Pierre

1

Sie können ein Aggregat mit mehr als einem Parameter definieren.

Ich weiß nicht, ob das Ihr Problem löst, aber man könnte es wie folgt verwenden:

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 
); 

es wie folgt verwendet werden:

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

Der Punkt ist "Wie übergebe ich zusätzliche Parameter zur endgültigen Funktion?". Sie an die Zustandsfunktion zu übergeben, ist einfach. – Pierre

+0

Es gibt keine Möglichkeit dies zu tun, Sie müssen Ihren eigenen Typ erstellen. Meine Antwort wurde von Ihrem Beispiel inspiriert. Was ist das Problem, das Sie versuchen zu lösen? Vielleicht gibt es einen einfacheren Weg als ein zusätzliches Argument für die endgültige Funktion. –

Verwandte Themen