Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/pgSQL:向查询结果添加静态列_Sql_Postgresql_Plpgsql - Fatal编程技术网

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()
a
LATERAL
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
中的各种行集插入到临时表中并返回该行集。