PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come restituire il numero dinamico di colonne in funzione?

Questo è possibile per le funzioni di ritorno RECORD.

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

E ora puoi fare:

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)

Il molto serio lo svantaggio è che ogni volta che chiami la funzione devi definire un insieme di colonne restituite, quindi non credo che troverai utile questa risposta :)

Ad ogni modo, Postgresql deve conoscere il tipo restituito di ogni SELECT prima esegue la query, quindi in un modo o nell'altro devi definire le colonne.

Il valore restituito JSON potrebbe essere una risposta ragionevole se desideri solo i dati e non ti interessa se ci sono colonne separate o meno.