这是我在这里解决的问题的补充: how to get array of zip codes within x miles in perl
好的,我有@zips数组。现在我试图在这样的查询中使用它:
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')"
但是,我无法让它发挥作用。 (我正在使用占位符,例如您在上面的链接中看到的内容。)
我能够让这个工作:
$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
但是,由于显而易见的原因和一些准确性的相似性,这并不是我想要的。只是想看看我是否可以独自完成工作。
为什么我不能使用IN获取查询以使用数组中的拉链?没有返回,也没有错误。
在该查询中实际上还有很多,但是,我把它全部留在这里以保持简短。
我试图自己解决这个问题。显然,我当天的学习能力接近顶峰。
感谢您的帮助。
答案 0 :(得分:8)
如果您的任何值包含单引号,则此处发布的所有示例都会搞砸,请勿使用它们。
相反(假设$dbh
是mysql连接的数据库句柄):
my $zip_string = join q{,}, map $dbh->quote($_), @zips;
并插入 。
或者,对于一些不错的东西,但不是像DBIx :: Perlish:SQL::Abstract那样破解的一半。
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.
答案 1 :(得分:6)
可以使用占位符完成,您只需要解决每个占位符只能接受单个值的限制。 WHERE zip IN (?)
无效,因为您(大概)正在寻找多个值(否则,为什么要使用IN
?)。
但是,您可以使用正确数量的占位符轻松构建语句:
#!/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 "$stmt\n";
# Now just:
# my $sth = $dbh->prepare($stmt);
# $sth->execute(@zips);
答案 2 :(得分:1)
或者,如果您不介意使用奇怪的CPAN模块,
使用DBIx::Perlish
,您只需说:
my @results = db_fetch {
my $t: table;
$t->public_gig eq "y";
$t->zip <- @zips;
};
它会做正确的事。
完全披露:我是DBIx::Perlish
的作者。
答案 3 :(得分:-1)
我不太了解perl,但这看起来像一个简单的SQL问题:为什么不从数组中构建SQL IN子句?你应该得到像
这样的东西AND zip IN('zip 1','zip 2','...')
我怀疑只是在perl中添加一个数组会为SQL字符串创建正确的字符串......
答案 4 :(得分:-5)
您需要将数组转换为以逗号分隔的值字符串。 试试这个:
my $zipcodes = join('\',\'',@zips);
SELECT `club_name`,`city` FROM `table` WHERE `public_gig` = 'y' AND `zip` IN ('".$zipcodes."');