我正在使用PostgreSQL 9.3。
表partner.partner_statistic
包含以下列:
id reg_count
serial integer
我编写了函数convert(integer):
CREATE FUNCTION convert(d integer) RETURNS integer AS $$
BEGIN
--Do something and return integer result
END
$$ LANGUAGE plpgsql;
现在我需要编写一个函数返回的整数数组,如下所示:
CREATE FUNCTION res() RETURNS integer[] AS $$
<< outerblock >>
DECLARE
arr integer[]; --That array of integers I need to fill in depends on the result of query
r partner.partner_statistic%rowtype;
table_name varchar DEFAULT 'partner.partner_statistic';
BEGIN
FOR r IN
SELECT * FROM partner.partner_statistic offset 0 limit 100
LOOP
--
-- I need to add convert(r[reg_count]) to arr where r[id] = 0 (mod 5)
--
-- How can I do that?
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
答案 0 :(得分:3)
您不需要(也不应该使用)PL / PgSQL循环。只需使用聚合。我猜你的意思是“where r[id] = 0 (mod 5)
,但我假设你的意思是”其中id可以被5“整除。”(请注意,这不是一回事as “每隔五行”,因为生成的ID有间隙)。
类似的东西:
SELECT array_agg(r.reg_count)
FROM partner.partner_statistic
WHERE id % 5 = 0
LIMIT 100
可能满足您的需求。
如果要返回值,请使用RETURN QUERY SELECT ...
或最好使用简单的sql语言函数。
如果需要动态表名,请使用:
RETURN QUERY EXECUTE format('
SELECT array_agg(r.reg_count)
FROM %I
WHERE id % 5 = 0
LIMIT 100', table_name::regclass);