代码之家  ›  专栏  ›  技术社区  ›  szabgab Brandon Fosdick

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

  •  16
  • szabgab Brandon Fosdick  · 技术社区  · 15 年前

    下面的代码对于获取单个计数值来说似乎太多了。 是否有更好的推荐方法使用普通DBI获取单个计数值?

    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 回复  |  直到 15 年前
        1
  •  35
  •   Dave Sherohman    15 年前

    只需一行即可轻松完成,无需额外变量:

    $count = $dbh->selectrow_array('SELECT count(*) FROM table WHERE...', undef, @params);
    
        2
  •  3
  •   Tony Andrews    15 年前

    我不知道Perl,但如果它的语法是合乎逻辑的,那么我认为根据您的第2个示例,这会起作用:

    sub get_count {
       return $dbh->selectall_arrayref("SELECT ...", undef, @params)->[0][0];
    }
    
        3
  •  1
  •   Joe Casadonte    15 年前

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

    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');
    

    除了污染一个不属于您的名称空间之外,您还必须为您使用的每个DB驱动程序编写这个名称空间,尽管我相信您可以设计一些允许您构造和评估一些代码来自动配置给定DBH对象的代码。