我有这个功能:
CREATE OR REPLACE FUNCTION func2(a integer[])
RETURNS SETOF newset AS
$BODY$
declare
x int;
begin
FOREACH x IN ARRAY $1
LOOP
RETURN QUERY SELECT * FROM func1(x);
END LOOP;
return;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
func2
只需将所有行中的所有行追加到func1
。如果第一次呼叫func1
给出了2行,第二次呼叫给了3行,func2
将返回总共5行(行本身)。
func1
返回3列的架构,因此当前func2
会返回相同的架构。
我想更改func2
,以便返回4列。来自func1
的3和另一列包含x
的值。
例如:
致电func2(ARRAY[500,200])
并假设func1(500)
返回2行,func1(200)
返回3行。
我会得到:
first second third forth
a b c 500
d e f 500
g h i 200
j k l 200
m n o 200
我为func2创建了一个newset2
newset
和另一列int
CREATE OR REPLACE FUNCTION func2(a integer[])
RETURNS SETOF newset2 AS
如何将所需的列添加到函数中?
答案 0 :(得分:2)
您可以返回额外的列:
RETURN QUERY SELECT *, x FROM func1(x);
答案 1 :(得分:0)
使用SELECT
unnest()
联接进行简单LATERAL
查询可以大大提高效率。应用任何排序顺序也更简单。
SELECT f.*, x
FROM unnest(ARRAY[500,200]) x, func1(x) f -- implicit LATERAL join
ORDER BY x;
全部,包括额外请求的排序顺序
它是您SELECT * FROM func2(ARRAY[500,200])
的替代品,不需要func2()
。
当然, 仍然可以将其包装成一个函数。我建议一个简单的SQL函数:
CREATE OR REPLACE FUNCTION func2(a integer[])
RETURNS SETOF newset AS
$func$
SELECT f.*, x
FROM unnest(ARRAY[500,200]) x, func1(x) f
ORDER BY x;
$func$ LANGUAGE sql
必须以某种方式预先定义行类型newset
。
相关: