Sql 伯克利DB等效于SELECT COUNT(*)All,SELECT COUNT(*),其中类似于“%…%”&引用;

Sql 伯克利DB等效于SELECT COUNT(*)All,SELECT COUNT(*),其中类似于“%…%”&引用;,sql,berkeley-db,Sql,Berkeley Db,我正在寻找伯克利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

我正在寻找伯克利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;
//键=1
i=1;
strcpy_s(buf,to_string(i).size()+1,to_string(i).c_str());
key.data=buf;
key.size=to_字符串(i).size()+1;
key.flags=0;
data.data=rbuf;
data.size=sizeof(rbuf)+1;
data.flags=0;
//光标
if((ret=dbp->cursor(dbp,NULL,&dbcp,0))!=0){
dbp->err(dbp,ret,“DB->cursor”);
后藤err1;
}
//得到
dbcp->get(dbcp,&key,&data\u read,DB\u SET\u RANGE);
db_recno_t cnt;
dbcp->count(dbcp,&cnt,0);

cout您期望Berkeley DB比实际更高级别。它不包含任何你想要的东西。如果您想要类似于“%1%”的
WHERE字段
,您必须创建一个光标,读取数据库中的所有值,然后自己进行字符串比较以找出匹配的值。这就是SQL引擎实现查询的实际功能,如果您使用的是libdb而不是SQL引擎,则由您决定。如果希望更快地完成,可以使用辅助索引(就像可以在SQL中为表创建其他索引一样),但必须提供一些代码将辅助索引链接到主数据库

DB\u SET\u RANGE
有助于优化一个非常特定的情况:您正在查找其键以特定子字符串开头的项。您可以
DB\u SET\u RANGE
找到第一个匹配的键,然后
DB\u NEXT
通过匹配找到匹配的键,并在获得不匹配的键时停止。这只适用于
DB_BTREE
数据库,因为它取决于按词法顺序返回的键

count方法告诉您当前光标位置的项目有多少个精确的重复键。

您可以使用该方法

例如,BT_树中唯一键的数量

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