MySQL - Perl:如何在选择查询中使用IN数组? (在哪里(@array))

时间:2011-02-28 22:51:55

标签: mysql arrays perl

这是我在这里解决的问题的补充: 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获取查询以使用数组中的拉链?没有返回,也没有错误。

在该查询中实际上还有很多,但是,我把它全部留在这里以保持简短。

我试图自己解决这个问题。显然,我当天的学习能力接近顶峰。

感谢您的帮助。

5 个答案:

答案 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."');