ホームページ >データベース >mysql チュートリアル >PostgreSQL 関数内で SELECT クエリの結果を返す方法は?
関数内の 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>
この関数の戻り値の型は、明示的に txt
、cnt
、および 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 サイトの他の関連記事を参照してください。