我有一个集合返回函数 (SRF),它接受一个整数参数并从表中返回一组行。我使用 SELECT * FROM tst.mySRF(3);
调用它,然后像处理表格一样处理返回值。
我想做的是对数组的每个元素执行它;但是,当我使用 SELECT * FROM tst.mySRF(unnest(array[3,4]));
调用它时,返回错误“在无法接受集合的上下文中调用的集合值函数”。如果我改为使用 SELECT tst.mySRF(unnest(array[3,4]));
调用它,我会得到一组 tst.tbl
。
表定义:
DROP TABLE tst.tbl CASCADE;
CREATE TABLE tst.tbl (
id serial NOT NULL,
txt text NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO tst.tbl(txt) VALUES ('a'), ('b'), ('c'), ('d');
函数定义:
CREATE OR REPLACE FUNCTION tst.mySRF(
IN p_id integer
)
RETURNS setof tst.tbl
LANGUAGE plpgsql
AS $body$
DECLARE
BEGIN
RETURN QUERY
SELECT id, txt
FROM tst.tbl
WHERE id = p_id;
END;
$body$;
调用:
SELECT * FROM tst.mySRF(3)
按预期返回一个表。SELECT tst.mySRF(unnest(array[3,4]))
按预期返回一个表,其中包含类型为tst.tbl
的单个列。SELECT * FROM tst.mySRF(unnest(array[3,4]))
返回上述错误,我曾期待一个表格。
最佳答案
为避免“单列表”问题,您需要使用(row).*
notation显式扩展SRF结果
SELECT (tst.mySRF(unnest(array[3,4]))).*;
如果我理解@depesz,LATERAL
将提供一种更有效或更直接的方法来实现相同的结果。
关于postgresql - 使用数组中的每个元素调用 set-returning 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14733470/