Dette er muligt for RECORD returnerende funktioner.
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$
;
Og nu kan du gøre:
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 meget alvorlige Ulempen er, at hver gang du kalder funktionen skal du definere sæt af returnerede kolonner, så jeg tror ikke, du vil finde dette svar nyttigt :)
Under alle omstændigheder skal Postgresql kende den returnerede type af hver SELECT før den kører forespørgslen, så på en eller anden måde skal du definere kolonnerne.
JSON-returværdi kunne være et rimeligt svar, hvis du bare vil have dataene og er ligeglad med, om der er separate kolonner eller ej.