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
我有这个功能:
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