Това е възможно за връщащи функции 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$
;
И сега можете да направите:
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)
Намного сериозно недостатъкът е, че всеки път, когато извикате функцията, трябва да дефинирате набор от върнати колони, така че не мисля, че ще намерите този отговор за полезен :)
Както и да е, Postgresql трябва да знае върнатия тип на всеки SELECT before той изпълнява заявката, така че по един или друг начин трябва да дефинирате колоните.
Връщаната стойност на JSON може да бъде разумен отговор, ако просто искате данните и не ви интересува дали има отделни колони или не.