Maison >base de données >tutoriel mysql >Comment transmettre plusieurs valeurs à une fonction PostgreSQL à l'aide d'un seul paramètre ?
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.
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.
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>
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
.
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!