PL / pgSQL:添加静态列以查询结果

时间:2015-06-25 11:30:23

标签: 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

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

如何将所需的列添加到函数中?

2 个答案:

答案 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

相关: