17

次のコードは、単一のカウント値を取得するには多すぎるようです。プレーン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;
}

これは短いですが、まだ2つのステートメントがあります。

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

3 に答える 3

35

追加の変数なしで 1 行で実行できるほど簡単です。

$count = $dbh->selectrow_array('SELECT count(*) FROM table WHERE...', undef, @params);
于 2009-11-01T12:32:44.717 に答える
3

私はPerlを知りませんが、構文が論理的であれば、2番目の例に基づいてこれが機能すると思います:

sub get_count {
   return $dbh->selectall_arrayref("SELECT ...", undef, @params)->[0][0];
}
于 2009-11-01T11:24:58.360 に答える
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');

自分のものではない名前空間を汚染するだけでなく、使用するすべての DB ドライバーに対してこれを記述する必要がありますが、コードを構築して評価し、特定の特定の名前空間に対してこれを自動構成できるようにすることができると確信しています。 DBH オブジェクト。

于 2009-11-01T14:13:51.813 に答える