從函數內的 PostgreSQL SELECT 查詢回傳資料
本指南解決了在 PostgreSQL 函數中傳回 SELECT
查詢結果的常見挑戰。 關鍵是理解如何正確定義返回類型並使用適當的語法。
RETURN QUERY
解:
最有效的方法是使用RETURN QUERY
指令。這清楚地定義了傳回的列及其資料類型。 考慮這個例子:
<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens INT) RETURNS TABLE (txt TEXT, cnt BIGINT, ratio NUMERIC) AS $$ BEGIN RETURN QUERY SELECT t.txt, count(*) AS cnt, (count(*)::NUMERIC * 100) / _max_tokens AS ratio FROM ( SELECT txt FROM token WHERE chartype = 'ALPHABETIC' LIMIT _max_tokens ) t GROUP BY t.txt ORDER BY cnt DESC; END; $$ LANGUAGE plpgsql;</code>
此函數的傳回型別明確是一個包含 txt
、cnt
和 ratio
欄位的表。 請注意使用 ::NUMERIC
進行明確類型轉換以確保精確的比率計算。 沒有單獨的 RETURN
宣告是故意的; RETURN QUERY
處理回傳值。
仔細命名:
避免輸出參數和查詢列名稱之間的命名衝突。 使用表格限定(例如,t.txt
)可以防止歧義。
相對份額計算的替代方法:
為了計算每個令牌的相對份額,使用視窗函數的替代方案可以提高效率:
<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens INT) RETURNS TABLE (txt TEXT, abs_cnt BIGINT, relative_share NUMERIC) AS $$ BEGIN RETURN QUERY SELECT txt, cnt, ROUND((cnt::NUMERIC * 100) / SUM(cnt) OVER (), 2) AS relative_share FROM ( SELECT txt, COUNT(*) AS cnt FROM token WHERE chartype = 'ALPHABETIC' GROUP BY txt ORDER BY cnt DESC LIMIT _max_tokens ) t ORDER BY cnt DESC; END; $$ LANGUAGE plpgsql;</code>
此版本使用 SUM(cnt) OVER ()
計算所有行的總計數,提供更簡潔的相對份額計算。
重要提示:
使用 RETURN
或輸出參數時,不需要明確 RETURNS TABLE
語句。 函數的回傳行為由 RETURNS
子句和查詢本身定義。
以上是如何在 PostgreSQL 函數中傳回 SELECT 查詢的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!