/ / MySQL - Perl: Comment utiliser un tableau avec IN dans une requête select? (WHERE IN (@array)) - mysql, tableaux, perl

MySQL - Perl: Comment utiliser un tableau avec IN dans une requête select? (WHERE IN (@array)) - mysql, tableaux, perl

Ceci est un ajout à ma question résolue ici: comment obtenir un tableau de codes postaux dans un rayon de x miles en perl

OK, j'ai le tableau @zips. Maintenant, j'essaie de l'utiliser dans une requête comme celle-ci:

SELECT `club_name`,`city` FROM `table` WHERE `public_gig` = "y" AND `zip` IN (@zips)
#I also tried syntax "IN ("@zips"), IN @zips and IN ("@zips")"

Mais je n'arrive pas à le faire fonctionner. (J'utilise des espaces réservés et comme vous le voyez dans mon lien ci-dessus.)

J'ai pu faire en sorte que cela fonctionne:

$fzip=shift(@Zips);
$lzip=pop(@Zips);
SELECT `club_name`,`city` FROM `table` WHERE `public_gig` = "y" AND `zip` BETWEEN $fzip AND $lzip

ZIP | public_gig | start_time | fin_time | city       | club_name | and so on
33416 | y          | 9pm        | 2am      | clearwater | beach bar | yada

Mais, pour des raisons évidentes et une certaine ressemblance d'exactitude, ce n'est pas vraiment ce que je veux. Je voulais juste voir si je pouvais faire fonctionner quelque chose par moi-même.

Pourquoi ne puis-je pas obtenir que la requête fonctionne avec les zips du tableau en utilisant IN? Rien n’est renvoyé et il n’ya pas d’erreur.

En fait, il y en a beaucoup plus dans cette requête, mais j'ai tout laissé pour rester bref ici.

J'ai essayé de comprendre par moi-même. De toute évidence, ma capacité d'apprentissage pour la journée est proche du maximum.

Merci pour toute aide.

Réponses:

8 pour la réponse № 1

Tous les exemples postés ici se tromperont si l'une de vos valeurs contient des guillemets simples, ne les utilisez pas.

Au lieu de cela (en supposant que $dbh est le gestionnaire de base de données pour votre connexion mysql):

my $zip_string = join q{,}, map $dbh->quote($_), @zips;

et interpoler cette.

Ou, pour quelque chose de gentil, mais pas à moitié aussi puissant que DBIx :: Perlish: SQL :: Résumé.

my $sqla = SQL::Abstract->new;
my ($sql, @bind) = $sqla->select(
"table",
["club_name", "city"],
{
public_gig => y",
zip => { -in => @zips },
}
);

$dbh->prepare($sql);
$dbh->execute(@bind);
# fetchrow etc.

6 pour la réponse № 2

Ce pouvez Pour utiliser des espaces réservés, il vous suffit de contourner la limitation selon laquelle chaque espace réservé ne peut accepter qu'une seule valeur. WHERE zip IN (?) ne fonctionnera pas parce que vous cherchez (probablement) plus d’une valeur (sinon, pourquoi utiliser IN?).

Cependant, vous pouvez facilement créer une déclaration à la volée avec le nombre correct de caractères génériques:

#!/usr/bin/env perl

use strict;
use warnings;

my @zips = (12345, 54321, 90210);
my $stmt = "SELECT `club_name`,`city`
FROM `table`
WHERE `public_gig` = "y" AND `zip` IN ("
. join(", ", ("?") x @zips) . ")";

print "$stmtn";

# Now just:
# my $sth = $dbh->prepare($stmt);
# $sth->execute(@zips);

1 pour la réponse № 3

Sinon, si cela ne vous dérange pas d’utiliser d’étranges modules CPAN, avec DBIx::Perlish vous pouvez juste dire:

my @results = db_fetch {
my $t: table;
$t->public_gig eq "y";
$t->zip  <-  @zips;
};

et il fera la bonne chose.

Divulgation complète: Je suis l'auteur de DBIx::Perlish.


-1 pour la réponse № 4

Je ne connais pas trop Perl, mais cela ressemble à un simple problème SQL: pourquoi ne pas construire la clause SQL IN à partir de votre tableau? Vous devriez obtenir quelque chose comme

ET zip IN ("zip 1", "zip 2", "...")

Je doute que le simple fait d'ajouter un tableau en Perl créera les bonnes chaînes pour la chaîne SQL ...


-5 pour la réponse № 5

Vous devez transformer le tableau en chaîne de valeurs séparées par des virgules. Essaye ça :

my $zipcodes = join("","",@zips);
SELECT `club_name`,`city` FROM `table` WHERE `public_gig` = "y" AND `zip` IN ("".$zipcodes."");