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

Ste*_*yne 4 mysql arrays perl

这是我在这里解决的问题的补充: 如何在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)

  • 撇开“刺激”部分不谈,关于“所有示例”和单引号的陈述实际上是不正确的。:-) (2认同)

Dav*_*man 7

可以使用占位符来完成,您只需要解决每个占位符只能接受单个值的限制. 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 字符串创建正确的字符串......