Passer littéral de tableau de PostgreSQL fonction
J'ai une Postgres fonction qui contient une instruction select. J'ai besoin d'ajouter une condition à l'aide d'un passé dans la variable contenant un tableau de valeurs de chaîne.
CREATE OR REPLACE FUNCTION get_questions(vcode text)
RETURN return_value as $f$
DECLARE vresult return_value;
BEGIN
--snip--
SELECT id, title, code
FROM questions WHERE code NOT IN (vcode);
--snip--
questions
table:
id ,title, code
1, "title1", "qcode1"
2, "title2", "qcode2"
3, "title3", "qcode3"
4, "title4", "qcode4"
Comment le vcode
littérale être formaté en PHP et ce qui devrait être la syntaxe de l'état?
L'utilisation de PostgreSQL 9.1.1, PHP 5.3.6, pg_query_params
.
PostgreSQL et les versions de PHP? Êtes-vous d'utiliser PDO ou la
Je suis l'aide de la pg_ fonctions. pg_query_params($db, $SQL, $input)
La partie de
Postgres 9.1.1, PHP 5.3.6
Eh bien, tout d'abord, vous êtes vulnérable à une importante faille de sécurité, de mise à jour. postgresql.org/support/security/faq/2013-04-04
pg_
fonctions?Je suis l'aide de la pg_ fonctions. pg_query_params($db, $SQL, $input)
La partie de
PostgreSQL and PHP versions
était pas clair?Postgres 9.1.1, PHP 5.3.6
Eh bien, tout d'abord, vous êtes vulnérable à une importante faille de sécurité, de mise à jour. postgresql.org/support/security/faq/2013-04-04
OriginalL'auteur DevR | 2013-06-16
Vous devez vous connecter pour publier un commentaire.
SQL
NOT IN
fonctionne avec jeux de. Puisque vous êtes de passage dans un tableau, utilisez<> ALL
.Vous devez être très prudent de ne pas impliquer tout
NULL
valeurs avec une telle expression, parce queNULL <> anything
jamais évalue àTRUE
et, par conséquent, ne jamais se qualifie dans unWHERE
clause.Votre fonction pourrait ressembler à ceci:
Appel:
Ou (syntaxe alternative avec un constructeur array):
Ou vous pouvez utiliser un
VARIADIC
paramètre:... et passer un liste de valeurs:
Détails:
Les points principaux:
À l'aide d'une simple fonction SQL car il n'y a rien dans votre question, qui obligerait les éléments de procédure de PL/pgSQL.
Le paramètre d'entrée est un tableau de texte:
text[]
À retourner plusieurs lignes de votre utilisation de la requête
RETOURNE la TABLE
pour le type de retour.Se référant à la en paramètre avec le paramètre de position
$1
depuis mentionner le nom n'a été introduite avec la version 9.2 pour les fonctions SQL (par opposition à plpgsql fonctions dans lesquelles il a été autour depuis quelques versions maintenant).Table-qualifier les noms de colonnes qui seraient autrement en conflit avec
OUT
paramètres du même nom défini dans leRETURNS
clause.LEFT JOIN unnest($1)
/IS NULL
Plus rapide pour les longs tableaux (> ~ 80 éléments, ça dépend):
Cette variante (par opposition à la ci-dessus) ignore les valeurs NULL dans le tableau d'entrée.
Si c'est plus facile pour vous de passer d'une chaîne séparée par des virgules comme
text
, vous pouvez le faire, et de le transformer en un tableau à l'intérieur de la fonction avecstring_to_array()
. Si votre liste devient longue, les performances seront meilleures avecLEFT JOIN
/IS NULL
. J'ai ajouté le code de démonstration à ma réponse.OriginalL'auteur Erwin Brandstetter