Maison >base de données >tutoriel mysql >Comment trier et limiter efficacement les résultats d'une fonction de table PostgreSQL ?

Comment trier et limiter efficacement les résultats d'une fonction de table PostgreSQL ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 02:33:40724parcourir

How to Efficiently Order and Limit Results from a PostgreSQL Table Function?

Ordre et limitation paramétrés par PostgreSQL dans les fonctions de table

Question :

Comment peut-on ordonner et limiter efficacement les résultats lors de l'utilisation une fonction de table SQL comme getStuff ? L'ordre et la limitation en dehors de la fonction ou l'utilisation de plpgsql sont envisagés. Existe-t-il une meilleure approche ?

Réponse :

Malgré son apparence initiale, une fonction plpgsql est l'option privilégiée pour gérer des scénarios plus complexes. Les performances ne peuvent souffrir que lorsque les fonctions plpgsql sont imbriquées, où le planificateur de requêtes ne peut pas optimiser complètement le code dans le contexte de la requête externe.

Une fonction plpgsql simplifiée qui évite un CASE excessif clauses :

CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
  RETURNS SETOF stuff AS
$func$
BEGIN
   RETURN QUERY EXECUTE '
      SELECT *
      FROM   stuff
      WHERE  col = 
      ORDER  BY ' || quote_ident(_orderby) || ' ASC
      LIMIT  '
   USING _param, _limit;
END
$func$  LANGUAGE plpgsql;

Utilisation :

SELECT * FROM get_stuff('hello', 'col2', 100);

Remarques :

  • Utilisez RETURN QUERY EXECUTE pour renvoie les résultats de la requête en une seule opération.
  • Assurez-vous que les identifiants sont à l'épreuve de SQLi avec quote_ident().
  • Utilisez USING pour transmettre les valeurs des paramètres, empêchant ainsi la conversion et SQLi.
  • Évitez les conflits de noms entre les paramètres et les noms de colonnes.
  • La fonction modifiée initiale échoue car elle renvoie le parent mais est déclaré comme renvoyant des éléments SETOF. Pensez plutôt à utiliser RETURNS TABLE.

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