首頁 >資料庫 >mysql教程 >如何有效地排序和限制 PostgreSQL 表函數的結果?

如何有效地排序和限制 PostgreSQL 表函數的結果?

Barbara Streisand
Barbara Streisand原創
2025-01-05 02:33:40627瀏覽

How to Efficiently Order and Limit Results from a PostgreSQL Table Function?

PostgreSQL 表函數中的參數化排序和限制

問題:

如何在使用時有效地排序和排序限制結果像getStuff 這樣的SQL 表函數?正在考慮在函數外部進行排序和限製或使用 plpgsql。有更好的方法嗎?

答案:

儘管它最初出現,plpgsql 函數 是處理更複雜場景的首選選項。只有當 plpgsql 函數嵌套時,效能可能會受到影響,此時查詢規劃器無法在外部查詢的上下文中完全最佳化程式碼。

簡化的plpgsql 函數,避免過多的CASE子句:

CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
  RETURNS SETOF stuff AS
$func$
BEGIN
   RETURN QUERY EXECUTE '
      SELECT *
      FROM   stuff
      WHERE  col = 
      ORDER  BY ' || quote_ident(_orderby) || ' ASC
      LIMIT  '
   USING _param, _limit;
END
$func$  LANGUAGE plpgsql;

用法:

SELECT * FROM get_stuff('hello', 'col2', 100);

註解:

  • 使用RETURN QUERY EXECUTE 來單一傳回查詢結果操作。
  • 使用 quote_ident() 確保標識符是 SQLi 防護的。
  • 利用 USING 傳遞參數值,防止強制轉換和 SQLi。
  • 避免參數和列之間的命名衝突名稱。
  • 初始編輯的函數失敗,因為它傳回父級,但聲明傳回 SETOF 內容。考慮使用 RETURNS TABLE 代替。

以上是如何有效地排序和限制 PostgreSQL 表函數的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn