1

我有一个集合返回函数 (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]))返回上面描述的错误,我期待一个表。
4

1 回答 1

3

为避免“单列表”问题,您需要使用(row).*符号显式扩展 SRF 结果

 SELECT (tst.mySRF(unnest(array[3,4]))).*;

如果我理解@depesz,LATERAL将提供一种更有效或更直接的方法来实现相同的结果。

于 2013-02-06T17:33:04.547 回答