我在 Ubuntu 10.04 上运行 Perl 5.10 并使用 perl DBI 模块。我正在尝试在 Perl DBI 下的 SQL 查询中的“WHERE”子句中使用“AND”条件。我正在使用 DBD::CSV 驱动程序。
请考虑下面的 test.csv:
OS,RELEASE,VERSION
Ubuntu,Warty,4
Ubuntu,Hoary,5
Ubuntu,Breezy,5
Fedora,Yarrow,1
Fedora,Tettnang,2
Fedora,Stentz,4
在这里,我想检索 Fedora Stentz 的 VERSION。这是我的代码:
#!/usr/bin/perl -w
use strict;
use DBI;
my $table = "test.csv";
my $dbh = DBI->connect ("dbi:CSV:") or die "Cannot connect to the CSV file: $DBI::errstr()";
$dbh->{RaiseError} = 1;
$dbh->{TraceLevel} = 0;
my $query = "select VERSION from $table where OS='Fedora' and RELEASE='Yarrow'";
my $sth = $dbh->prepare ($query);
$sth->execute ();
$sth->dump_results();
$sth->finish();
$dbh->disconnect();
这是hte输出;
0 rows
如果我在查询中使用占位符而不是实际值,如下所示:
my $query = "select VERSION from $table where OS=? and RELEASE=?";
my $sth = $dbh->prepare ($query);
$sth->execute ('Fedora', 'Yarrow');
$sth->dump_results();
$sth->finish();
$dbh->disconnect();
那么输出是一个错误如下:
DBD::CSV::st execute failed: You passed 2 parameters where 0 required [for Statement "select VERSION from test.csv where OS=? and RELEASE=?"] at count.pl line 14.
DBD::CSV::st execute failed: You passed 2 parameters where 0 required [for Statement "select VERSION from test.csv where OS=? and RELEASE=?"] at count.pl line 14.
但是,如果我在 hte WEHRE 子句中只使用一个条件,如下所示,那么脚本会给我正确的输出:
my $query = "select VERSION from $table where OS=?";
my $sth = $dbh->prepare ($query);
$sth->execute ('Fedora');
$sth->dump_results();
$sth->finish();
$dbh->disconnect();
hte 输出为:
'1'
'2'
'4'
3 rows
所以,底线和我的问题是,当我在“where”子句中写“and”条件时,它不起作用。我怀疑我的查询语法有问题,但还不能弄清楚。任何指示或建议都会有很大帮助。
另外,我在 perlmonks 上有一个关于同一问题的持续线程:http ://www.perlmonks.org/?node_id=990214
谢谢。