首页 > 数据库 > mysql教程 > PostgreSQL函数如何高效返回结果集?

PostgreSQL函数如何高效返回结果集?

Mary-Kate Olsen
发布: 2025-01-17 10:26:14
原创
188 人浏览过

How to Efficiently Return Result Sets in PostgreSQL Functions?

在 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 参数的数据类型以匹配查询的返回

命名注意事项

命名 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板