所有先前存在的答案都已过时或开始时效率低下。
假设您要返回三integer
列。
PL/pgSQL 函数
以下是使用现代 PL/pgSQL(PostgreSQL 8.4 或更高版本)的方法:
CREATE OR REPLACE FUNCTION f_foo() -- (open_id numeric) -- parameter not used
RETURNS TABLE (a int, b int, c int) AS
$func$
BEGIN
RETURN QUERY VALUES
(1,2,3)
, (3,4,5)
, (3,4,5)
;
END
$func$ LANGUAGE plpgsql IMMUTABLE ROWS 3;
在 Postgres 9.6 或更高版本中,您还可以添加PARALLEL SAFE
.
称呼:
SELECT * FROM f_foo();
要点
用于RETURNS TABLE
定义要返回的临时行类型。
或者RETURNS SETOF mytbl
使用预定义的行类型。
用于RETURN QUERY
通过一个命令返回多行。
使用VALUES
表达式手动输入多行。这是标准 SQL,并且一直存在。
如果您确实需要参数,请使用参数名称(open_id numeric)
而不是ALIAS
,这是不鼓励的。在示例中,没有使用参数,只是噪音......
无需双引号完全合法的标识符。双引号仅用于强制其他非法名称(大小写混合、非法字符或保留字)。
函数的波动性可以是IMMUTABLE
,因为结果永远不会改变。
ROWS 3
是可选的,但既然我们知道返回了多少行,我们不妨将它声明给 Postgres。可以帮助查询计划者选择最佳计划。
简单的 SQL
对于像这样的简单情况,您可以改用普通的 SQL 语句:
VALUES (1,2,3), (3,4,5), (3,4,5)
或者,如果您想(或必须)定义特定的列名和类型:
SELECT *
FROM (
VALUES (1::int, 2::int, 3::int)
, (3, 4, 5)
, (3, 4, 5)
) AS t(a, b, c);
SQL 函数
您可以将其包装成一个简单的SQL 函数:
CREATE OR REPLACE FUNCTION f_foo()
RETURNS TABLE (a int, b int, c int) AS
$func$
VALUES (1, 2, 3)
, (3, 4, 5)
, (3, 4, 5);
$func$ LANGUAGE sql IMMUTABLE ROWS 3;