2012-03-21 50 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。