我正在尝试在plpgsql中创建一个函数,如:
CREATE OR REPLACE FUNCTION select_left_photo_ids(in_photo_id bigint[], in_album_id bigint, in_limit int) RETURNS SETOF bigint[] AS
$$
DECLARE photo_count int;
DECLARE photo_ids bigint[];
BEGIN
SELECT photo_id INTO STRICT photo_ids FROM tbl_album_photos WHERE album_id = in_album_id AND photo_id < in_photo_id ORDER BY photo_id DESC LIMIT in_limit;
GET DIAGNOSTICS photo_count = ROW_COUNT;
IF photo_count < in_limit THEN
SELECT photo_id INTO STRICT photo_ids FROM (SELECT photo_id FROM tbl_album_photos WHERE album_id = in_album_id ORDER BY photo_id LIMIT in_limit) AS dummy ORDER BY photo_id DESC;
END IF;
RETURN photo_ids;
END;
$$
LANGUAGE plpgsql;
想法是获取大于输入照片ID的照片ID。如果没有。结果中的照片小于限制,我将尝试获取底部n条记录。
以上功能不起作用。有人可以给出一些关于如何在变量中存储选择查询结果的指针/提示或链接。
注意:photo_id是bigint[]
数据类型 - 我的意思是故意bigint[]
。
答案 0 :(得分:4)
您需要将array_agg
添加到
bigint[]
结果以放入bigint[]
目标。然后,您需要添加派生表以使LIMIT正常工作。
select array_agg(photo_id) into strict photo_ids
from (
select photo_id
from tbl_album_photos
where album_id = in_album_id
and photo_id < in_photo_id
order by photo_id desc
limit in_limit
) dt;
然后您可以询问数组有多大而不是查看ROW_COUNT:
photo_count := array_length(photo_ids, 1);
然后下一个SELECT ... INTO将类似于上面的新array_agg
版本。