Renvoyer les résultats de la requête dans la fonction PostgreSQL
PostgreSQL fournit deux méthodes pour renvoyer les résultats des requêtes à partir des fonctions : les paramètres OUT et RETURNS TABLE. Lors de l'utilisation du paramètre OUT, la signature de la fonction spécifie la liste des variables qui reçoivent la valeur de la requête. Toutefois, cette approche interdit les définitions explicites de types de retour et peut entraîner des conflits de noms de colonnes.
UTILISER LE TABLEAU DES RETOURS
Pour une solution plus pratique et plus puissante, pensez à utiliser RETURNS TABLE. Cette syntaxe définit le modèle de retour exact d'une fonction, autorisant des noms de colonnes et des définitions de types explicites.
<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>
Remarque :
Une alternative à l'utilisation des fonctions de fenêtre
Si vous devez calculer la part relative de chaque jeton, pensez à utiliser une fonction de fenêtre dans votre requête :
<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>
Cette requête utilise la clause over() pour calculer la part relative de chaque jeton.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!