ホームページ >データベース >mysql チュートリアル >PostgreSQL 関数で結果セットを効率的に返すにはどうすればよいですか?

PostgreSQL 関数で結果セットを効率的に返すにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-17 10:26:14190ブラウズ

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 パラメータのデータ型を指定できるようにします。 value.

命名に関する考慮事項

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。