Maison > base de données > tutoriel mysql > Comment renvoyer le résultat d'une requête SELECT dans une fonction PostgreSQL ?

Comment renvoyer le résultat d'une requête SELECT dans une fonction PostgreSQL ?

Linda Hamilton
Libérer: 2025-01-17 10:21:12
original
984 Les gens l'ont consulté

How to Return the Result of a SELECT Query within a PostgreSQL Function?

Renvoi de données à partir d'une requête PostgreSQL SELECT dans une fonction

Ce guide aborde le défi courant consistant à renvoyer les résultats d'une SELECT requête dans une fonction PostgreSQL. La clé est de comprendre comment définir correctement le type de retour et utiliser la syntaxe appropriée.

La RETURN QUERY Solution :

La méthode la plus efficace consiste à utiliser la commande RETURN QUERY. Cela définit clairement les colonnes renvoyées et leurs types de données. Prenons cet exemple :

<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens INT)
RETURNS TABLE (txt TEXT, cnt BIGINT, ratio NUMERIC)
AS $$
BEGIN
   RETURN QUERY
   SELECT t.txt, count(*) AS cnt, (count(*)::NUMERIC * 100) / _max_tokens AS ratio
   FROM (
      SELECT txt
      FROM token
      WHERE chartype = 'ALPHABETIC'
      LIMIT _max_tokens
   ) t
   GROUP BY t.txt
   ORDER BY cnt DESC;
END;
$$ LANGUAGE plpgsql;</code>
Copier après la connexion

Le type de retour de cette fonction est explicitement une table avec les colonnes txt, cnt et ratio. Notez l'utilisation de ::NUMERIC pour la conversion de type explicite afin de garantir un calcul de rapport précis. L'absence d'une déclaration RETURN distincte est intentionnelle ; RETURN QUERY gère la valeur de retour.

Dénomination soignée :

Évitez les conflits de noms entre les paramètres de sortie et les noms de colonnes de requête. L'utilisation de la qualification de table (par exemple, t.txt) évite toute ambiguïté.

Approche alternative pour le calcul de la part relative :

Pour calculer la part relative de chaque jeton, une alternative utilisant les fonctions de fenêtre offre une efficacité améliorée :

<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens INT)
RETURNS TABLE (txt TEXT, abs_cnt BIGINT, relative_share NUMERIC)
AS $$
BEGIN
   RETURN QUERY
   SELECT txt, cnt, ROUND((cnt::NUMERIC * 100) / SUM(cnt) OVER (), 2) AS relative_share
   FROM (
      SELECT txt, COUNT(*) AS cnt
      FROM token
      WHERE chartype = 'ALPHABETIC'
      GROUP BY txt
      ORDER BY cnt DESC
      LIMIT _max_tokens
   ) t
   ORDER BY cnt DESC;
END;
$$ LANGUAGE plpgsql;</code>
Copier après la connexion

Cette version utilise SUM(cnt) OVER () pour calculer le nombre total sur toutes les lignes, fournissant ainsi un calcul de part relative plus concis.

Remarque importante :

Les instructions

Explicites RETURN sont inutiles lors de l'utilisation de RETURNS TABLE ou de paramètres de sortie. Le comportement de retour de la fonction est défini par la clause RETURNS et la requête elle-même.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal