ホームページ >データベース >mysql チュートリアル >PostgreSQL 関数から SELECT クエリ結果を正しく返すにはどうすればよいですか?

PostgreSQL 関数から SELECT クエリ結果を正しく返すにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-17 10:32:14122ブラウズ

How to Correctly Return SELECT Query Results from a PostgreSQL Function?

PostgreSQL 関数で SELECT クエリの結果を返す

PostgreSQL では、関数を使用して SELECT クエリの結果を返すには、適切な構文と戻り値の型を理解する必要があります。提供されている関数の 1 つを調べて、クエリ結果を正しく取得する方法を説明します。

問題の関数 wordFrequency には現在、正しい return ステートメントがありません。この問題を解決するには、RETURN QUERY 構文を使用します。

修正された関数:

<code class="language-sql">CREATE OR REPLACE FUNCTION wordFrequency(_max_tokens integer)
RETURNS SETOF RECORD AS $$
BEGIN
  RETURN QUERY
  SELECT text, count(*), 100.0 / _max_tokens * count(*) AS ratio
  FROM (
    SELECT text
    FROM token
    WHERE chartype = 'ALPHABETIC'
    LIMIT _max_tokens
  ) AS tokens
  GROUP BY text
  ORDER BY count DESC;
END;
$$ LANGUAGE plpgsql;</code>

キーポイント:

  • RETURN QUERY 構文を使用すると、SELECT クエリの結果を直接返すことができます。
  • SETOF RECORD は、関数がレコードのセットを返すことを示します。
  • 関数本体の出力パラメーター (textcount(*) など) は、クエリ内の列名と一致する必要があります。 AS ratio を追加して、3 番目の列に明確な名前を付け、曖昧さを回避しました。 同時に、整数の除算による精度の低下を避けるために、100100.0 に変更します。

関数の呼び出し:

<code class="language-sql">SELECT * FROM wordFrequency(123);</code>

さらに、RETURNS TABLE を使用して戻り値の型を明示的に定義すると、関数呼び出しごとに列定義のリストを指定する必要がなくなるため、汎用レコードを返すよりも実用的です。 例:

<code class="language-sql">CREATE OR REPLACE FUNCTION wordFrequency(_max_tokens integer)
RETURNS TABLE (text TEXT, cnt BIGINT, ratio NUMERIC) AS $$
BEGIN
  RETURN QUERY
  SELECT text, count(*), 100.0 / _max_tokens * count(*)
  FROM (
    SELECT text
    FROM token
    WHERE chartype = 'ALPHABETIC'
    LIMIT _max_tokens
  ) AS tokens
  GROUP BY text
  ORDER BY count DESC;
END;
$$ LANGUAGE plpgsql;</code>

重要な注意事項:

  • クエリ内の列名との競合を避けるために、出力パラメータ名を慎重に選択してください。
  • 潜在的な名前の競合を解決するには、SELECT リスト内の項目の順序位置を使用するか、ORDER BY で式を繰り返します。
  • 丸め誤差を最小限に抑えるために、整数を含む計算で除算する前に、数値データ型を使用するか乗算することを検討してください。

これらの手順に従うことで、PostgreSQL の関数を効率的に使用して SELECT クエリの結果を返すことができます。

以上がPostgreSQL 関数から SELECT クエリ結果を正しく返すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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