这是我在这里解决的问题的补充: 如何在perl的x英里内获得邮政编码数组
好的,我有阵列@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')"
Run Code Online (Sandbox Code Playgroud)
但是,我无法让它发挥作用.(我正在使用占位符,例如您在上面的链接中看到的.)
我能够让这个工作:
$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
Run Code Online (Sandbox Code Playgroud)
但是,由于显而易见的原因和一些准确性的相似性,这并不是我想要的.只是想看看我是否可以让自己有所作为.
为什么我不能使用IN获取查询以使用数组中的拉链?没有返回任何内容,也没有错误.
在这个查询中实际上有很多,但是,我把它全部留在这里以保持简短.
我试图自己解决这个问题.显然,我当天的学习能力接近顶峰.
谢谢你的帮助.
hob*_*bbs 10
如果您的任何值包含单引号,则此处发布的所有示例都会搞砸,请勿使用它们.
相反(假设$dbh是mysql连接的数据库句柄):
my $zip_string = join q{,}, map $dbh->quote($_), @zips;
Run Code Online (Sandbox Code Playgroud)
和插值那.
或者,对于一些不错的东西,但不像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.
Run Code Online (Sandbox Code Playgroud)
这可以使用占位符来完成,您只需要解决每个占位符只能接受单个值的限制. 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);
Run Code Online (Sandbox Code Playgroud)
The*_*Eye -1
我不太了解 perl,但这看起来像是一个简单的 SQL 问题:为什么不直接从数组构建 SQL IN 子句呢?你应该得到类似的东西
AND zip IN ('zip 1', 'zip 2', '...')
我怀疑仅仅在 perl 中添加一个数组就能为 SQL 字符串创建正确的字符串......