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为啥又叫做db4

在 Berkeley DB Core 和 Berkeley DB JE 之间进行选择

berkeley-db-je 的最新版本是啥?

我可以使用 oracle berkeley db java edition 的 c 实现(python bsddb)创建的 bdb(berkeley db)文件吗?

berkeley db java edition怎样存储数据库?

[转] berkeley db aosa阅读