【问题标题】:Berkeley DB equivalent of SELECT COUNT(*) All, SELECT COUNT(*) WHERE LIKE "%...%"Berkeley DB 相当于 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 记录吗?

谢谢

【问题讨论】:

    标签: sql berkeley-db


    【解决方案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; 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多