ホームページ >データベース >mysql チュートリアル >PostgreSQL 関数内で SELECT クエリの結果を返す方法は?

PostgreSQL 関数内で SELECT クエリの結果を返す方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-17 10:21:12984ブラウズ

How to Return the Result of a SELECT Query within a PostgreSQL Function?

関数内の 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>

この関数の戻り値の型は、明示的に txtcnt、および 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 中国語 Web サイトの他の関連記事を参照してください。

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