Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengembalikan Hasil Pertanyaan dengan Cekap daripada Fungsi PostgreSQL?
Kembalikan hasil pertanyaan dalam fungsi PostgreSQL
PostgreSQL menyediakan dua kaedah untuk mengembalikan hasil pertanyaan daripada fungsi: parameter OUT dan RETURNS TABLE. Apabila menggunakan parameter OUT, tandatangan fungsi menentukan senarai pembolehubah yang menerima nilai pertanyaan. Walau bagaimanapun, pendekatan ini melarang definisi jenis pulangan eksplisit dan boleh menyebabkan konflik nama lajur.
GUNAKAN JADUAL PEMULANGAN
Untuk penyelesaian yang lebih mudah dan berkuasa, pertimbangkan untuk menggunakan RETURNS TABLE. Sintaks ini mentakrifkan corak pulangan yang tepat bagi sesuatu fungsi, membenarkan nama lajur dan definisi jenis yang jelas.
<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int) RETURNS TABLE (txt text -- 在函数体中也可见为 OUT 参数 , cnt bigint , ratio bigint) LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY SELECT t.txt , count(*) AS cnt -- 列别名仅在此查询中可见 , (count(*) * 100) / _max_tokens -- 我添加了括号 FROM ( SELECT t.txt FROM token t WHERE t.chartype = 'ALPHABETIC' LIMIT _max_tokens ) t GROUP BY t.txt ORDER BY cnt DESC; -- 潜在的歧义 END $func$; SELECT * FROM word_frequency(123);</code>
Nota:
Alternatif untuk menggunakan fungsi tetingkap
Jika anda perlu mengira bahagian relatif setiap token, pertimbangkan untuk menggunakan fungsi tetingkap dalam pertanyaan anda:
<code class="language-sql">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$;</code>
Pertanyaan ini menggunakan klausa over() untuk mengira bahagian relatif setiap token.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengembalikan Hasil Pertanyaan dengan Cekap daripada Fungsi PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!