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

PL/pgSQL: Add static column to query result

我有这个功能:

CREATE OR REPLACE FUNCTION func2(a integer[])
  RETURNS SETOF newset AS

$BODY$
declare 
    x int;
begin

  FOREACH x IN ARRAY  
  LOOP
    RETURN QUERY SELECT * FROM  func1(x); 
  END LOOP;

return;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE

func2 只需将所有调用的所有行追加到 func1。如果第一次调用 func1 给出 2 行,第二次调用给出 3 行,func2 将 return 总共 5 行(行本身)。

func1 returns 是一个 3 列的模式,所以目前 func2 return 相同的模式。

我想更改 func2 使其成为 return 4 列。来自 func1 的 3 和另一列包含 x.

的值

例如: 打电话 func2(ARRAY[500,200]) 并假设 func1(500) return 2 行和 func1(200) return 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

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

您可以 return 额外的列:

RETURN QUERY SELECT *, x FROM  func1(x); 

使用 unnest()LATERAL 连接的普通 SELECT 查询可以显着 提高效率 。应用任何排序顺序也更简单。

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 必须以某种方式预先定义。

相关:

  • PostgreSQL unnest() with element number