用Poco选择EXISTS的值

时间:2016-10-18 21:07:02

标签: mysql poco-libraries

我正在尝试查看带有Poco库的MySQL表中是否存在行。

这样做的一种方法是:

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())。无论nint还是bool,都会出现这种情况(由于EXISTS会返回BOOLEAN,因此会更加充分。)

如果问题出在我的绑定上(因为错误意味着,即使此绑定与我之前完成的其他查询相同),我尝试使用RecordSet执行此操作,暂时删除所有绑定此测试,然后将其打印到屏幕上。

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

查询和RecordSet的构造似乎工作正常,但当我尝试打印到控制台时,会抛出Poco::BadCastException

那么,这可以用Poco完成,还是我必须继续使用SELECT COUNT(*)方法?

1 个答案:

答案 0 :(得分:0)

所以,我不会使用Poco,所以我无法对此发表评论。但是,如果您无法直接使用它,请不要诉诸count(*),因为这对大型表的操作要慢得多。最糟糕的情况是,您需要以下内容:

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

或者您希望为truefalse提供的任何其他价值。