Maison >base de données >tutoriel mysql >Comment transmettre plusieurs valeurs à une fonction PostgreSQL à l'aide d'un seul paramètre ?

Comment transmettre plusieurs valeurs à une fonction PostgreSQL à l'aide d'un seul paramètre ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-10 06:33:411002parcourir

How to Pass Multiple Values to a PostgreSQL Function Using a Single Parameter?

Passer plusieurs valeurs via un seul paramètre dans les fonctions PostgreSQL

Ce guide montre comment transmettre efficacement plusieurs valeurs à une fonction PostgreSQL en utilisant un seul paramètre, en se concentrant sur le type VARIADIC et en proposant des stratégies d'optimisation.

Exploiter le paramètre VARIADIC

Le type VARIADIC de PostgreSQL offre une solution concise pour gérer plusieurs valeurs d'entrée au sein d'un seul paramètre. Adaptons un exemple de fonction :

<code class="language-sql">CREATE OR REPLACE FUNCTION test(VARIADIC int[])
RETURNS TABLE (job_id int, job_reference int, job_job_title text, job_status text) AS
$$
BEGIN
RETURN QUERY
SELECT j.id, j.reference, j.job_title,
       ltrim(right(j.status, -2)) AS status  -- Optimized string trimming
FROM jobs j
JOIN company c ON j.id = c.id
WHERE c.active
AND NOT c.delete_flag
AND NOT j.delete_flag
AND (j.id = ANY() OR '{<b>-1</b>}'::int[] = )
ORDER BY j.job_title;
END;
$$ LANGUAGE plpgsql;</code>

Cette fonction révisée accepte un tableau d'entiers (int[]) en entrée. Le mot-clé VARIADIC permet à la fonction d'accepter un nombre variable d'arguments entiers, les convertissant automatiquement en tableau.

Invocation de fonction avec VARIADIC

La fonction peut être invoquée directement à l'aide d'un tableau :

<code class="language-sql">SELECT * FROM test(<b>VARIADIC</b> '{1, 2, 3}'::int[]);</code>

Ceci est fonctionnellement équivalent à :

<code class="language-sql">SELECT * FROM test(1, 2, 3);</code>

Améliorations des performances et meilleures pratiques

Découpage efficace des chaînes : Pour PostgreSQL 9.1 et versions ultérieures, l'utilisation de right() avec une longueur négative (right(j.status, -2)) fournit une méthode plus rapide et plus propre pour supprimer les caractères principaux par rapport à substring().

Considérations sur le type de données : Si DeleteFlag représente des valeurs booléennes, l'utilisation du type de données boolean est plus efficace et sémantiquement correcte que text. Évitez les guillemets inutiles autour des noms de colonnes dans les clauses WHERE.

Fonction simplifiée (implémentation SQL)

Pour une meilleure lisibilité et des gains de performances potentiels, envisagez une implémentation purement SQL :

<code class="language-sql">CREATE OR REPLACE FUNCTION f_test(VARIADIC int[])
RETURNS TABLE (id int, reference int, job_title text, status text) AS
$func$
   SELECT j.id, j.reference, j.job_title
        , ltrim(right(j.status, -2)) AS status
   FROM job j
   JOIN company c ON j.id = c.id
   WHERE c.active
   AND NOT c.delete_flag
   AND NOT j.delete_flag
   AND (j.id = ANY() OR '{-1}'::int[] = )
   ORDER BY j.job_title
$func$ LANGUAGE sql;</code>

Cette version simplifiée offre la même fonctionnalité avec une concision améliorée. N'oubliez pas d'ajuster les noms des tables et des colonnes pour qu'ils correspondent à votre schéma spécifique.

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