Heim > Datenbank > MySQL-Tutorial > Wie kann ich Abfrageergebnisse von PostgreSQL-Funktionen effizient zurückgeben?

Wie kann ich Abfrageergebnisse von PostgreSQL-Funktionen effizient zurückgeben?

Mary-Kate Olsen
Freigeben: 2025-01-17 10:12:10
Original
371 Leute haben es durchsucht

How Can I Efficiently Return Query Results from PostgreSQL Functions?

Abfrageergebnisse in der PostgreSQL-Funktion zurückgeben

PostgreSQL bietet zwei Methoden zum Zurückgeben von Abfrageergebnissen von Funktionen: OUT-Parameter und RETURNS TABLE. Bei Verwendung des OUT-Parameters gibt die Funktionssignatur die Liste der Variablen an, die den Abfragewert empfangen. Dieser Ansatz verbietet jedoch explizite Definitionen von Rückgabetypen und kann zu Konflikten mit Spaltennamen führen.

RÜCKGABETABELLE VERWENDEN

Für eine bequemere und leistungsfähigere Lösung sollten Sie die Verwendung von RETURNS TABLE in Betracht ziehen. Diese Syntax definiert das genaue Rückgabemuster einer Funktion und ermöglicht explizite Spaltennamen und Typdefinitionen.

<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>
Nach dem Login kopieren

Hinweis:

  • Qualifizieren Sie die Spaltennamen der OUT-Parameter mithilfe von Tabellenqualifizierern, um Konflikte zu vermeiden.
  • Wählen Sie OUT-Parameter und Spaltenaliase sorgfältig aus, um Mehrdeutigkeiten zu vermeiden.
  • Vermeiden Sie die Verwendung von „text“ oder „count“ als Spaltennamen.
  • Erwägen Sie die Verwendung numerischer Datentypen für eine genauere Ganzzahldivision.

Eine Alternative zur Verwendung von Fensterfunktionen

Wenn Sie den relativen Anteil jedes Tokens berechnen müssen, sollten Sie die Verwendung einer Fensterfunktion in Ihrer Abfrage in Betracht ziehen:

<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>
Nach dem Login kopieren

Diese Abfrage verwendet die over()-Klausel, um den relativen Anteil jedes Tokens zu berechnen.

Das obige ist der detaillierte Inhalt vonWie kann ich Abfrageergebnisse von PostgreSQL-Funktionen effizient zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage