sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur returnerar dynamiskt antal kolumner i funktion?

Detta är möjligt för RECORD-returfunktioner.

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

Och nu kan du göra:

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)

Den mycket allvarliga Nackdelen är att varje gång du anropar funktionen måste du definiera en uppsättning returnerade kolumner, så jag tror inte att du kommer att finna det här svaret användbart :)

Hur som helst, Postgresql behöver veta den returnerade typen av varje SELECT före den kör frågan, så på ett eller annat sätt måste du definiera kolumnerna.

JSON-returvärde kan vara ett rimligt svar om du bara vill ha data och inte bryr dig om det finns separata kolumner eller inte.



  1. DISTINCT ON i django

  2. Returnera booleskt värde från oracle-funktionen

  3. Hämtar data från MYSQL baserat på veckonummer

  4. E-postkonto lösenordslagring i Java/Mysql serverprogram