Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengembalikan Hasil Pertanyaan SELECT dalam Fungsi PostgreSQL?

Bagaimana untuk Mengembalikan Hasil Pertanyaan SELECT dalam Fungsi PostgreSQL?

Linda Hamilton
Linda Hamiltonasal
2025-01-17 10:21:12988semak imbas

How to Return the Result of a SELECT Query within a PostgreSQL Function?

Memulangkan Data daripada Pertanyaan SELECT PostgreSQL dalam Fungsi

Panduan ini menangani cabaran biasa untuk mengembalikan hasil pertanyaan SELECT dalam fungsi PostgreSQL. Perkara utama ialah memahami cara mentakrifkan jenis pulangan dengan betul dan menggunakan sintaks yang sesuai.

Penyelesaian RETURN QUERY:

Kaedah yang paling berkesan ialah menggunakan perintah RETURN QUERY. Ini dengan jelas mentakrifkan lajur yang dikembalikan dan jenis datanya. Pertimbangkan contoh ini:

<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>

Jenis pemulangan fungsi ini secara eksplisit ialah jadual dengan lajur txt, cnt dan ratio. Perhatikan penggunaan ::NUMERIC untuk tuangan jenis eksplisit bagi memastikan pengiraan nisbah yang tepat. Ketiadaan pernyataan RETURN yang berasingan adalah disengajakan; RETURN QUERY mengendalikan nilai pulangan.

Penamaan Berhati-hati:

Elakkan menamakan konflik antara parameter output dan nama lajur pertanyaan. Menggunakan kelayakan jadual (cth., t.txt) menghalang kekaburan.

Pendekatan Alternatif untuk Pengiraan Saham Relatif:

Untuk mengira bahagian relatif setiap token, alternatif menggunakan fungsi tetingkap menawarkan kecekapan yang lebih baik:

<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>

Versi ini menggunakan SUM(cnt) OVER () untuk mengira jumlah kiraan merentas semua baris, memberikan pengiraan bahagian relatif yang lebih ringkas.

Nota Penting:

Penyataan

Eksplisit RETURN tidak diperlukan apabila menggunakan RETURNS TABLE atau parameter output. Tingkah laku pemulangan fungsi ditakrifkan oleh klausa RETURNS dan pertanyaan itu sendiri.

Atas ialah kandungan terperinci Bagaimana untuk Mengembalikan Hasil Pertanyaan SELECT dalam Fungsi PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn