PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie wird die dynamische Anzahl von Spalten in Funktion zurückgegeben?

Dies ist für RECORD-Rückgabefunktionen möglich.

CREATE FUNCTION calculation(how_many integer) RETURNS SETOF RECORD
LANGUAGE plpgsql
AS $fff$
BEGIN
    IF how_many = 1
        THEN RETURN QUERY SELECT 'foo'::text;
    ELSIF how_many = 2
        THEN RETURN QUERY SELECT 'foo'::text, 'bar'::text;
    END IF;
END;
$fff$
;

Und jetzt können Sie:

jbet=> SELECT * FROM calculation(1) AS f(first_col text);
 first_col
-----------
 foo
(1 row)

jbet=> SELECT * FROM calculation(2) AS f(first_col text, second_col text);
 first_col | second_col
-----------+------------
 foo       | bar
(1 row)

Die sehr ernst Nachteil ist, dass Sie jedes Mal, wenn Sie die Funktion aufrufen, eine Reihe von zurückgegebenen Spalten definieren müssen, also glaube ich nicht, dass Sie diese Antwort nützlich finden werden :)

Auf jeden Fall muss Postgresql den zurückgegebenen Typ jedes SELECT vorher kennen es führt die Abfrage aus, also müssen Sie die Spalten auf die eine oder andere Weise definieren.

Der JSON-Rückgabewert könnte eine vernünftige Antwort sein, wenn Sie nur die Daten möchten und sich nicht darum kümmern, ob es separate Spalten gibt oder nicht.