Berkeley DB相当于SELECT COUNT(*)All,SELECT COUNT(*)WHERE LIKE"%...%"

时间:2014-04-02 19:25:56

标签: sql berkeley-db

我正在寻找相当于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所有记录吗?

由于

2 个答案:

答案 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; 
}