PL/pgSQL:向查询结果添加静态列
我有这个功能:PL/pgSQL:向查询结果添加静态列,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我有这个功能: 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
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
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
func2
只需将所有调用中的所有行追加到func1
。如果对func1
的第一次调用给出了2行,第二次调用给出了3行,func2
将总共返回5行(行本身)
func1
返回一个包含3列的架构,因此当前func2
返回相同的架构
我想更改func2
,使其返回4列。来自func1
的3和另一列,其中包含x
的值
例如:
调用func2(数组[500200])
并假设func1(500)
return2行和func1(200)
return3行。
我会得到:
first second third forth
a b c 500
d e f 500
g h i 200
j k l 200
m n o 200
我创建了一个newset2
,它是newset
,func2的另一列是int
CREATE OR REPLACE FUNCTION func2(a integer[])
RETURNS SETOF newset2 AS
如何将所需列添加到函数中?您只需返回额外的列:
RETURN QUERY SELECT *, x FROM func1(x);
通过使用
unnest()
aLATERAL
join进行简单的SELECT
查询,这可以大大提高效率。应用任何排序顺序也更简单
SELECT f.*, x
FROM unnest(ARRAY[500,200]) x, func1(x) f -- implicit LATERAL join
ORDER BY x;
仅此而已,包括额外请求的排序顺序。它是您的
SELECT*FROM func2(数组[500200])
的替代品,不需要func2()
当然,您仍然可以将其封装到函数中。我建议使用一个简单的SQL函数:
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
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
必须以某种方式预定义
相关的:
我可以通过x
订购吗?如果我添加orderby
,它将不起作用。它对func1
的特定调用进行排序,而不是对整个行进行排序。您的func2
会返回多次。为了有效排序,可以将func1
中的各种行集插入到临时表中并返回该行集。