我正在寻找相当于Berkeley DB的
SELECT COUNT All, SELECT COUNT WHERE LIKE "%...%"
我有100条带键的记录:1,2,3,...... 100.
我有以下代码:
//Key = 1
i=1;
strcpy_s(buf, to_string(i).size()+1, to_string(i).c_str());
key.data = buf;
key.size = to_string(i).size()+1;
key.flags = 0;
data.data = rbuf;
data.size = sizeof(rbuf)+1;
data.flags = 0;
//Cursor
if ((ret = dbp->cursor(dbp, NULL, &dbcp, 0)) != 0) {
dbp->err(dbp, ret, "DB->cursor");
goto err1;
}
//Get
dbcp->get(dbcp, &key, &data_read, DB_SET_RANGE);
db_recno_t cnt;
dbcp->count(dbcp, &cnt, 0);
cout <<"count: "<<cnt<<endl;
计数cnt始终为1,但我希望它计算Key = 1:1,10,11,21,... 91的所有部分键匹配。 我的代码/对DB_SET_RANGE的理解有什么问题? 是否可以获得SELECT COUNT WHERE LIKE&#34;%...%&#34;在BDB? 还可以从文件中获取SELECT COUNT所有记录吗?
由于
答案 0 :(得分:1)
你期待伯克利数据库比实际更高层次。它并不包含你所要求的任何东西。如果你想要等同于WHERE field LIKE '%1%'
你必须制作光标,请通过所有读取数据库中的值,并自己进行字符串比较以找出匹配的字符串。这是SQL引擎实际执行查询的实际操作,如果您使用的是libdb而不是SQL引擎,那么它取决于您。如果您希望它更快地完成,您可以使用辅助索引(就像您可以为SQL中的表创建其他索引一样),但是您必须提供一些将辅助索引链接到主DB的代码。
DB_SET_RANGE
对于优化特定情况非常有用:您正在查找其键以特定子字符串开头的项目。您可以DB_SET_RANGE
找到第一个匹配的密钥,然后DB_NEXT
找到匹配的密钥,并在获得不匹配的密钥时停止。这仅适用于DB_BTREE
数据库,因为它取决于按词汇顺序返回的键。
count方法告诉您当前光标位置的项目有多少完全重复的键。
答案 1 :(得分:0)
您可以使用方法DB->stat()。
例如,BT_TREE中的唯一键数。
bool row_amount(DB *db, size_t &amount) {
amount = 0;
if (db==NULL) return false;
DB_BTREE_STAT *sp;
int ret = db->stat(db, NULL, &sp, 0);
if(ret!=0) return false;
amount = (size_t)sp->bt_nkeys;
return true;
}