Heim >Datenbank >MySQL-Tutorial >Wie kann man Ergebnismengen in PostgreSQL-Funktionen effizient zurückgeben?
Ergebnismengen in PostgreSQL-Funktionen zurückgeben
Beim Schreiben von Funktionen in PostgreSQL ist es oft notwendig, Ergebnismengen zurückzugeben. Die bereitgestellte Funktion „wordFrequency“ ist korrekt mit dem Rückgabetyp SETOF RECORD definiert. Der aktuellen Implementierung fehlt jedoch der entsprechende Befehl, um das Ergebnis der Abfrage zurückzugeben.
RETURN QUERY
Die Lösung liegt in der Verwendung des RETURN QUERY-Befehls, wie im Folgenden gezeigt korrigierte Funktion:
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$;
Verwendung von RETURN TABLE
Das explizite Definieren des Rückgabetyps mithilfe von RETURNS TABLE bietet mehrere Vorteile:
Überlegungen zur Benennung
Seien Sie vorsichtig bei der Benennung von OUT-Parametern, da diese im gesamten Funktionskörper sichtbar sind. Um Konflikte oder Verwirrung zu vermeiden, qualifizieren Sie Tabellenspalten mit demselben Namen entweder vollständig oder befolgen Sie die empfohlenen Best Practices für die Benennung.
Alternativen
Die bereitgestellte alternative Abfrage berechnet den relativen Anteil pro 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$;
Diese Version verwendet eine Fensterfunktion und gewährleistet ein numerisches Ergebnis für einen genauen relativen Anteil Berechnung.
Das obige ist der detaillierte Inhalt vonWie kann man Ergebnismengen in PostgreSQL-Funktionen effizient zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!