gpt4 book ai didi

postgresql - 使用数组中的每个元素调用 set-returning 函数

转载 作者:行者123 更新时间:2023-11-29 12:47:06 24 4
gpt4 key购买 nike

我有一个集合返回函数 (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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com