Điều này có thể thực hiện được đối với các hàm trả về 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$
;
Và bây giờ bạn có thể làm:
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)
Rất nghiêm trọng nhược điểm là mỗi lần bạn gọi hàm, bạn phải xác định tập hợp các cột được trả về, vì vậy tôi không nghĩ rằng bạn sẽ thấy câu trả lời này hữu ích:)
Dù sao, Postgresql cần biết loại trả về của mỗi SELECT trước nó chạy truy vấn, vì vậy theo cách này hay cách khác, bạn phải xác định các cột.
Giá trị trả về JSON có thể là một câu trả lời hợp lý nếu bạn chỉ muốn dữ liệu và không quan tâm liệu có các cột riêng biệt hay không.