Mengembalikan Set Hasil dalam Fungsi PostgreSQL
Apabila menulis fungsi dalam PostgreSQL, selalunya perlu mengembalikan set hasil. Fungsi yang disediakan, wordFrequency, ditakrifkan dengan betul dengan jenis pemulangan SETOF RECORD. Walau bagaimanapun, pelaksanaan semasa tidak mempunyai arahan yang sesuai untuk mengembalikan hasil pertanyaan.
RETURN QUERY
Penyelesaian terletak pada menggunakan perintah RETURN QUERY, seperti yang ditunjukkan dalam yang berikut fungsi diperbetulkan:
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$;
Menggunakan RETURN JADUAL
Mentakrifkan jenis pulangan secara eksplisit menggunakan RETURNS TABLE menawarkan beberapa kelebihan:
Pertimbangan Penamaan
Berhati-hati apabila menamakan parameter OUT, kerana ia boleh dilihat di seluruh badan fungsi. Untuk mengelakkan konflik atau kekeliruan, sama ada melayakkan sepenuhnya lajur jadual dengan nama yang sama atau ikut amalan terbaik penamaan yang disyorkan.
Alternatif
Pertanyaan alternatif yang disediakan mengira bahagian relatif setiap token:
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$;
Versi ini menggunakan fungsi tetingkap dan memastikan hasil numerik untuk bahagian relatif yang tepat pengiraan.
Atas ialah kandungan terperinci Bagaimana untuk Mengembalikan Set Hasil dengan Cekap dalam Fungsi PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!