首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres数组作为where子句的函数输入

Postgres数组作为where子句的函数输入
EN

Stack Overflow用户
提问于 2012-03-22 06:19:56
回答 2查看 3K关注 0票数 1

我有一个VARCHAR作为PRIMARY_KEY的表,所以我的ID是随机生成的,看起来像WUoN5VemTMQvOQidTi。我只想写一个函数,它需要一个数组作为输入,并返回数组中包含的所有元素。我认为下面的半代码会更好地展示它的一种方式:

代码语言:javascript
复制
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结合起来呢?

有没有可能使用函数来实现这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-22 09:03:56

对于长数组,解嵌和连接到结果集是有代价的:

代码语言:javascript
复制
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运行测试,理想情况下报告您的发现。:)

票数 3
EN

Stack Overflow用户

发布于 2012-03-22 06:35:42

代码语言:javascript
复制
SELECT * FROM "myTable" WHERE "id" = any($1) ORDER BY "idDate" DESC;

这个函数是稳定的,不是易失性的,它返回table或类似的not varchar。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9813715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档