ホームページ >データベース >mysql チュートリアル >PostgreSQL 関数で結果セットを効率的に返すにはどうすればよいですか?
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 パラメータは関数本体全体で表示されるため、名前を付けるときは注意してください。競合や混乱を避けるために、テーブル列を同じ名前で完全修飾するか、推奨される命名ベスト プラクティスに従ってください。
代替
提供された代替クエリは、相対シェアを計算します。トークンごと:
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 サイトの他の関連記事を参照してください。