Dit is mogelijk voor RECORD-retourfuncties.
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$
;
En nu kun je het volgende doen:
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)
De zeer serieuze nadeel is dat elke keer dat je de functie aanroept je een reeks geretourneerde kolommen moet definiëren, dus ik denk niet dat je dit antwoord nuttig zult vinden:)
Hoe dan ook, Postgresql moet het geretourneerde type van elke SELECT weten voor het voert de query uit, dus je moet de kolommen op de een of andere manier definiëren.
JSON-retourwaarde kan een redelijk antwoord zijn als u alleen de gegevens wilt en het u niet uitmaakt of er afzonderlijke kolommen zijn of niet.