Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengembalikan Hasil Pertanyaan dengan Cekap daripada Fungsi PostgreSQL?

Bagaimanakah Saya Boleh Mengembalikan Hasil Pertanyaan dengan Cekap daripada Fungsi PostgreSQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-17 10:12:10373semak imbas

How Can I Efficiently Return Query Results from PostgreSQL Functions?

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:

  • Layakkan nama lajur parameter OUT menggunakan kelayakan jadual untuk mengelakkan konflik.
  • Pilih parameter OUT dan alias lajur dengan berhati-hati untuk mengelakkan kekaburan.
  • Elakkan menggunakan "teks" atau "kira" sebagai nama lajur.
  • Pertimbangkan untuk menggunakan jenis data berangka untuk pembahagian integer yang lebih tepat.

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!

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