2012-03-21 51 views
0

我有一个表VARCHARPRIMARY_KEY,所以我的ID是随机生成的,看起来像WUoN5VemTMQvOQidTi。我只想写一个函数,它需要一个数组作为输入并返回数组中包含的所有元素。我想下面的半代码将表现出更好的更好的方式:Postgres数组作为函数输入为where子句

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关键字找到多个值的解决方案,但有什么方法可以将数组和条目组合?

有没有机会使用函数来实现这个功能?

回答

3

对于阵列,它可以付费UNNEST并加入到结果集:

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运行测试,并理想地报告您的发现。 :)

+0

谢谢,但通过添加“ODER BY id_date DESC”得到以下错误: 查询失败:错误:列“id_date”必须出现在GROUP BY子句中或用于集合函数LINE 1: (SELECT)unterm($ 1))x(id)USING(id)ORDER BY“id_date”^ QUERY:SELECT(SELECT COUNT(*)FROM“myTable”JOIN使用(id)ORDER BY“myTable”。“id_date”DESC)语境:PL/pgSQL函数“get_info”。 出于测试目的,我将计算SELECT语句的结果。这将在稍后被替换... – Nrgyzer 2012-03-22 17:44:22

+0

@Nrgyzer:你以一种不可能的方式改变了功能(我测试过它的功能)。你不能同时计算(*)和ORDER BY id_date。请更新你的问题与你实际想要达到的目标。 – 2012-03-22 17:52:39

+0

嗯,好的...我刚刚删除了COUNT(*),它的工作原理,很棒......并感谢您的帮助:) – Nrgyzer 2012-03-22 17:55:50

1
SELECT * FROM "myTable" WHERE "id" = any($1) ORDER BY "idDate" DESC; 

这个函数是稳定的,不是volatile,它返回表或类似的not varchar。