我的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
- 关键字找到多个值的解决方案,但有没有办法组合数组和IN
- 子句?
有没有机会用功能实现这个?
答案 0 :(得分:3)
对于 long 数组,它可以支付给不需要的并加入到结果集中:
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
和返回类型提出了一些建议。我的演示返回整行。
不要只听我的表现。使用EXPLAIN ANALYZE
运行测试,最好报告您的发现。 :)
答案 1 :(得分:1)
SELECT * FROM "myTable" WHERE "id" = any($1) ORDER BY "idDate" DESC;
此函数是稳定的而不是volatile,它返回表或类似的varchar。