Maison >base de données >tutoriel mysql >Comment puis-je renvoyer efficacement les résultats de requêtes à partir des fonctions PostgreSQL ?

Comment puis-je renvoyer efficacement les résultats de requêtes à partir des fonctions PostgreSQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-17 10:12:10373parcourir

How Can I Efficiently Return Query Results from PostgreSQL Functions?

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 :

  • Qualifiez les noms de colonnes des paramètres OUT à l'aide de qualificatifs de table pour éviter les conflits.
  • Choisissez soigneusement les paramètres et les alias de colonnes pour éviter toute ambiguïté.
  • Évitez d'utiliser « texte » ou « compte » comme noms de colonnes.
  • Envisagez d'utiliser des types de données numériques pour une division entière plus précise.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn