[英]Postgres array as function input for where clause
我有一個表,其中VARCHAR
作為PRIMARY_KEY
,因此我的ID是隨機生成的,看起來像WUoN5VemT
或MQvOQidTi
。 我只想編寫一個函數,期望將數組作為輸入並返回數組中包含的所有元素。 我認為以下半代碼將更好地顯示它:
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.