在 PostgreSQL 函数中返回结果集
在 PostgreSQL 中编写函数时,经常需要返回结果集。所提供的函数 wordFrequency 已使用 SETOF RECORD 返回类型正确定义。然而,当前的实现缺乏适当的命令来返回查询结果。
RETURN QUERY
解决方案在于利用 RETURN QUERY 命令,如下所示更正后的函数:
CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int) RETURNS TABLE (txt text -- also visible as OUT param in function body , cnt bigint , ratio bigint) LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY SELECT t.txt , count(*) AS cnt -- column alias only visible in this query , (count(*) * 100) / _max_tokens -- I added parentheses FROM ( SELECT t.txt FROM token t WHERE t.chartype = 'ALPHABETIC' LIMIT _max_tokens ) t GROUP BY t.txt ORDER BY cnt DESC; -- potential ambiguity END $func$;
使用 RETURN TABLE
使用 RETURNS TABLE 显式定义返回类型有几个优点:
命名注意事项
命名 OUT 参数时要小心,因为它们在整个函数体中都是可见的。为了避免冲突或混淆,请完全限定具有相同名称的表列,或遵循建议的命名最佳实践。
替代方案
提供的替代查询计算相对份额每个代币:
CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int) RETURNS TABLE (txt text , abs_cnt bigint , relative_share numeric) LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY SELECT t.txt, t.cnt , round((t.cnt * 100) / (sum(t.cnt) OVER ()), 2) -- AS relative_share FROM ( SELECT t.txt, count(*) AS cnt FROM token t WHERE t.chartype = 'ALPHABETIC' GROUP BY t.txt ORDER BY cnt DESC LIMIT _max_tokens ) t ORDER BY t.cnt DESC; END $func$;
此版本采用窗口函数并确保准确的相对份额计算的数字结果。
以上是PostgreSQL函数如何高效返回结果集?的详细内容。更多信息请关注PHP中文网其他相关文章!