Berkeley DB 相当于 SELECT COUNT(*) All, SELECT COUNT(*) WHERE LIKE "%...%"
Posted
技术标签:
【中文标题】Berkeley DB 相当于 SELECT COUNT(*) All, SELECT COUNT(*) WHERE LIKE "%...%"【英文标题】:Berkeley DB equivalent of SELECT COUNT(*) All, SELECT COUNT(*) WHERE LIKE "%...%" 【发布时间】:2014-04-02 19:25:55 【问题描述】:我正在寻找相当于伯克利数据库的
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;
Count cnt 始终为 1,但我希望它计算 Key=1 的所有部分键匹配:1、10、11、21、... 91。 我的代码/对 DB_SET_RANGE 的理解有什么问题? 是否可以在 BDB 中获得 SELECT COUNT WHERE LIKE "%...%" ? 也可以从文件中获取 SELECT COUNT All 记录吗?
谢谢
【问题讨论】:
【参考方案1】:您期望 Berkeley DB 比实际更高级。它不包含您所要求的任何内容。如果你想要WHERE field LIKE '%1%'
的等价物,你必须创建一个游标,通读数据库中的 all 值,然后自己进行字符串比较以挑选出匹配的值。这就是 SQL 引擎实际执行查询的功能,如果您使用 libdb 而不是 SQL 引擎,则取决于您。如果您希望它完成得更快,您可以使用二级索引(就像您可以在 SQL 中为表创建附加索引一样),但您必须提供一些将二级索引链接到主数据库的代码。
DB_SET_RANGE
对于优化一个非常具体的情况很有用:您正在寻找键以特定子字符串开头的项目。您可以DB_SET_RANGE
找到第一个匹配的密钥,然后通过DB_NEXT
查找匹配项,并在获得不匹配的密钥时停止。这仅适用于 DB_BTREE
数据库,因为它取决于按词法顺序返回的键。
count 方法告诉您当前光标位置的项目有多少个精确重复键。
【讨论】:
【参考方案2】:您可以使用方法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;
【讨论】:
以上是关于Berkeley DB 相当于 SELECT COUNT(*) All, SELECT COUNT(*) WHERE LIKE "%...%"的主要内容,如果未能解决你的问题,请参考以下文章
在 Berkeley DB Core 和 Berkeley DB JE 之间进行选择
我可以使用 oracle berkeley db java edition 的 c 实现(python bsddb)创建的 bdb(berkeley db)文件吗?