2016-10-18 5 views
1

Pocoライブラリを持つMySQLテーブルに行が存在するかどうかを確認しようとしています。働くこれを行うのPocoでEXISTSの値を選択

一つの方法は、次のとおりです。その後、

session << "SELECT COUNT(*) FROM %s WHERE Serial=?", 
    into(n), // int 
    tableName, // string 
    use(serial), now; 

n==0かどうかを確認します。

ただし、これを行うための明確な(そして速い)方法は

session << "SELECT EXISTS(SELECT * FROM %s WHERE Serial = ?)", 
    into(n), 
    tableName, 
    use(serial), now; 

だろうnの値はその後、0または1このどちらかだろう、しかし、(!pBinder.isNull())実行時にアサーション例外がスローされます。これはnintboolEXISTSBOOLEANを返すので、これが適切です)に関係なく発生します。

私のバインディングに問題があった場合(このバインディングは以前に行った他のクエリと同じですが、エラーが暗示しているように)、このテストではすべてのバインディングを一時的に削除してRecordSetとしました。それを画面に印刷します。

session << "SELECT EXISTS(SELECT * FROM TestTable WHERE Serial = 'XXX')", now; 
RecordSet r(exists); 
cout << r; 

クエリとRecordSetの建設がうまく動作するように見えるが、私は、コンソールに印刷しようとすると、Poco::BadCastExceptionがスローされます。

これはPocoで行うことができますか、それともSELECT COUNT(*)の方法をそのまま使用する必要がありますか?

答えて

0

私はPocoを使用しないので、私はそれについてコメントすることはできません。しかし、直接動作させることができない場合は、count(*)に頼らないようにしてください。大きなテーブルでは処理がはるかに遅くなります。最悪のケースでは、あなたのような何かをしたいでしょう:

select if(exists(select 1 from %s where Serial=?), 1, 0)

や他のどんな値あなたはtruefalseを持っているしたいと思います。

+0

ヒントありがとうございますが、どちらも機能していません。 – Wasabi

関連する問題