我有一个VARCHAR作为PRIMARY_KEY的表,所以我的ID是随机生成的,看起来像WUoN5VemT或MQvOQidTi。我只想写一个函数,它需要一个数组作为输入,并返回数组中包含的所有元素。我认为下面的半代码会更好地展示它的一种方式:
CREATE OR REPLACE FUNCTION public."getInfo" (
"myIDs" varchar []
)
RETURNS varchar AS
$body$
BEGIN
SELECT * FROM "myTable" WHERE "id" IN($1) ORDER BY "idDate" DESC;
-- RETURN etc....
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;但问题是该数组可以包含50个或更多条目(也可以包含100个条目),因此我需要尽快完成此操作。下一个问题是,上面的代码不能工作。我经常使用IN-keyword找到多个值的解决方案,但是有没有办法将数组和IN-clause结合起来呢?
有没有可能使用函数来实现这一点呢?
发布于 2012-03-22 09:03:56
对于长数组,解嵌和连接到结果集是有代价的:
CREATE OR REPLACE FUNCTION get_info(_ids varchar[])
RETURNS SETOF tbl AS
$BODY$
SELECT t.*
FROM unnest(_ids) id
JOIN tbl t USING (id)
ORDER BY id_date DESC;
$BODY$
LANGUAGE sql STABLE;这可以是plpgsql函数,但SQL函数也可以。
@Clodoaldo已经给出了一些关于STABLE和返回类型的建议。我的demo返回整个行。
不要只相信我对性能的评价。使用EXPLAIN ANALYZE运行测试,理想情况下报告您的发现。:)
发布于 2012-03-22 06:35:42
SELECT * FROM "myTable" WHERE "id" = any($1) ORDER BY "idDate" DESC;这个函数是稳定的,不是易失性的,它返回table或类似的not varchar。
https://stackoverflow.com/questions/9813715
复制相似问题