从函数内的 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中文网其他相关文章!