我正在学习如何在Postgresql中编写函数。我已经定义了一个名为_tmp_myfunction()
这需要在id
并返回一个表函数(我也定义一个名为_tmp_mytable
表对象类型)在Postgresql中创建一个不返回复合值的函数
-- create object type to be returned
CREATE TYPE _tmp_mytable AS (
id integer,
cost double precision
);
-- create function which returns query
CREATE OR REPLACE FUNCTION _tmp_myfunction(
id integer
)
RETURNS SETOF _tmp_mytable AS $$
BEGIN
RETURN QUERY
SELECT
sales.gid,
cost
FROM
sales
WHERE
id = sales.gid;
END;
$$ LANGUAGE plpgsql;
,当我用一个id
并使用以下方法调用它也能正常工作:
SELECT * FROM _tmp_myfunction(402);
我想做什么就能做的是调用它,而是利用价值,而不只是一个值的列。但是,如果我用下面的办法我结束了在一个列的表的所有值,以逗号分隔:
-- call function using all values in a column
SELECT _tmp_myfunction(t.id)
FROM transactions as t;
我明白,我可以得到相同的结果,如果我用SELECT _tmp_myfunction(402);
而不是SELECT * FROM _tmp_myfunction(402);
,但我不知道如何构建函数,以便在传入值列时不会获得合成值。
刚刚更新了我的变量名称,使其更清晰一些(我改变了它们使我的问题更清晰,并错过了会有冲突)。 – djq
@ErwinBrandstetter虽然你可以在'SELECT'中调用一个返回函数,但这种行为真的很奇怪。这是一个传统的PostgreSQL特定的黑客,只要PostgreSQL 9.3的'LATERAL'可用就应该立即放弃。如果奇怪,比较'SELECT generate_series(1,3),generate_series(1,3);'到'SELECT generate_series(1,3),generate_series(1,4);'。第一个按顺序返回三行,结果对。第二个返回*十二*行,所有可能的结果配对,就像一个叉积。 –