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

时间:2012-03-21 22:19:56

标签: sql arrays postgresql

我的VARCHAR表格为PRIMARY_KEY,因此我的ID是随机生成的,看起来像WUoN5VemTMQvOQidTi。我只想编写一个函数,该函数需要一个数组作为输入并返回数组中包含的所有元素。我认为以下半代码会更好地表现出来:

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 - 子句?

有没有机会用功能实现这个?

2 个答案:

答案 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。