Heim >Datenbank >MySQL-Tutorial >Wie kann ich Abfrageergebnisse von PostgreSQL-Funktionen effizient zurückgeben?
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>
Hinweis:
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>
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!