簡體   English   中英

Postgres數組作為where子句的函數輸入

[英]Postgres array as function input for where clause

我有一個表,其中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子句?

是否有機會使用功能實現這一目標?

對於數組,可以付出不必要的代價並加入結果集:

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運行測試,並理想地報告您的發現。 :)

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

此函數穩定且穩定,它返回表或類似的非varchar。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM