Est-il SQL paramètre de liaison pour les tableaux?
Est-il un moyen standard pour lier les tableaux de scalaires) dans une requête SQL? Je veux lier dans un IN
alinéa, comme suit:
SELECT * FROM junk WHERE junk.id IN (?);
M'arrive d'être en utilisant Perl::DBI
qui contraint les paramètres pour les scalaires, donc je me retrouve avec inutile requêtes comme:
SELECT * FROM junk WHERE junk.id IN ('ARRAY(0xdeadbeef)');
Précisions: j'ai mis de la requête dans sa propre .sql
fichier, de sorte que la chaîne est déjà formé. Où les réponses mentionnent la création de la chaîne de requête dynamiquement je serais probablement faire une recherche et remplacer à la place.
Edit: Cette question est une sorte de double de Paramétrage d'un SQL À la clause?. J'ai d'abord pensé qu'il devrait être fermé tant que tel, mais il semble que c'est l'accumulation d'une partie bien spécifique pour Perl info.
- C'est un dupe d'un bien connus question. Permettez-moi juste de le trouver....
- Il est également la Base de données spécifique...
- Frais de recherche, mais ne pouvait pas trouver moi-même.
- Jetez un oeil à cette question. Je ne sais pas beaucoup au sujet de perl, mais si vous ne pouvez joindre le tableau d'ensemble, il est donc dans une chaîne de caractères que vous pourriez probablement obtenir pour fonctionner. Ou tout simplement utiliser le plus voté réponse à cette question.
- Trouvé, mais ce n'est pas avec les Tableaux, mais vous pourriez être en mesure de s'adapter.
Vous devez vous connecter pour publier un commentaire.
Vous spécifiez "c'est le SQL d'une requête avec un paramètre" -- qui ne fonctionne pas lorsque vous voulez qu'un grand nombre de paramètres. C'est une douleur à traiter avec, bien sûr. Deux autres variantes à ce qui a été déjà suggéré:
1) Utilisation DBI->quote au lieu de les détenteurs de place.
2) Utiliser un ORM pour faire ce genre de bas niveau de stuff pour vous. DBIx::Class ou Rose::DB::Objet, par exemple.
Si vous n'aimez pas la carte, vous pouvez utiliser le " x " de l'opérateur:
Les parenthèses sont nécessaires sur le'?', parce que les forces de 'x' pour être dans un contexte de liste.
Lire "perldoc perlop" et de la recherche pour " Binaire "x" pour plus d'informations (c'est dans le "Multiplicative Opérateurs" de la section).
Je fais quelque chose comme:
map { '?' } @vals
est plus simplement('?') x @vals
Et encore une autre façon de construire SQL est d'utiliser quelque chose comme SQL::Abstrait....
Avec la plaine
DBI
vous auriez à construire le SQL vous-même, comme suggéré ci-dessus. DBIx::Simple (un wrapper pourDBI
) le fait pour vous automatiquement en utilisant le '??' notation:En python, j'ai toujours fini par faire quelque chose comme:
...qui, pour l'essentiel construit une requête avec un"? " pour chaque élément de la liste.
(et si il y a d'autres paramètres, là aussi, vous devez vous assurer que vous ligne les choses correctement lorsque vous exécutez la requête)
[modifier pour rendre le code plus facile à comprendre pour les non-python personnes. Il y a un bug, d'où la requête a un supplément de virgule après le dernier ?, que je vais quitter en raison de fixation il serait juste de nuage de l'idée générale]
- Je utiliser DBIx::DWIW. Il contient une fonction appelée Dansliste(). Cela va créer la partie de la requête SQL est nécessaire pour que la liste. Toutefois, cela ne fonctionne que si vous avez tous vos SQL dans le programme au lieu d'à l'extérieur, dans un fichier séparé.
Utilisation
au lieu