Ответ 1
Достаточно легко сделать в одной строке без дополнительных переменных:
$count = $dbh->selectrow_array('SELECT count(*) FROM table WHERE...', undef, @params);
Следующий код кажется слишком большим, для получения единственного значения счета. Есть ли лучший, рекомендуемый способ получить одно значение COUNT, используя простой 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];
}
Достаточно легко сделать в одной строке без дополнительных переменных:
$count = $dbh->selectrow_array('SELECT count(*) FROM table WHERE...', undef, @params);
Я не знаю Perl, но если он синтаксис логичен, я бы подумал, что это будет работать на основе вашего второго примера:
sub get_count {
return $dbh->selectall_arrayref("SELECT ...", undef, @params)->[0][0];
}
Я, вероятно, не сделал бы этого сам, но вы всегда можете сделать его новой функцией верхнего уровня для объекта 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');
Помимо загрязнения пространства имен, которое не принадлежит вам, вам также придется писать это для каждого используемого драйвера DB, хотя я уверен, что вы можете что-то сделать, что позволяет вам построить и оценить некоторый код для автоматической настройки этого для данного объекта DBH.