如何使用DBI从数据库中获取单个计数值?

时间:2009-11-01 09:41:42

标签: database perl dbi

以下代码似乎太多了,因为获得单个计数值。 有没有更好的,推荐的方法来使用纯DBI获取单个COUNT值?

sub get_count {
   my $sth = $dbh->prepare("SELECT COUNT(*) FROM table WHERE...");
   $sth->execute( @params );
   my $($count) = $sth->fetchrow_array;
   $sth->finish;

   return $count;
}

这个更短,但我还有两个陈述。

sub get_count_2 {
   my $ar = $dbh->selectall_arrayref("SELECT ...", undef, @params)
   return $ar->[0][0];
}

3 个答案:

答案 0 :(得分:34)

在一行中很容易做到没有额外的变量:

$count = $dbh->selectrow_array('SELECT count(*) FROM table WHERE...', undef, @params);

答案 1 :(得分:3)

我不知道Perl,但如果它的语法是合乎逻辑的,我认为这可以根据你的第二个例子来运作:

sub get_count {
   return $dbh->selectall_arrayref("SELECT ...", undef, @params)->[0][0];
}

答案 2 :(得分:1)

我可能不会自己这样做,但你总是可以把它作为你正在使用的DBH对象的一个​​新的顶层函数:

警告:未经测试的代码如下!

sub DBD::SQLite::db::count
{
   my($dbh, $table, $where) = @_;

   my($stmt) = "SELECT COUNT(*) FROM $table";
   $stmt .= " WHERE $where" if $where;

   my($count) = $dbh->selectrow_array($stmt);

   return $count;

}

然后像这样调用它:

my($cnt) = $dbh->count('Employee', 'year_hired < 2000');

除了污染不属于您的命名空间外,您还必须为您使用的每个数据库驱动程序编写此命令,但我确信您可以使用某些功能,允许您构建和评估某些代码以自动配置此对于给定的DBH对象。