如何在SQLite3中绑定LIKE通配符

时间:2015-11-18 07:29:11

标签: sql c sqlite

我想运行SQL查询:SELECT COUNT(id) AS nbr FROM user WHERE name LIKE '%John%',并获取与关键字John匹配的记录数。

所以我写了以下代码:

unsigned int nbr;
char *sql, *like;
sqlite3 *db;
sqlite3_stmt *stmt;

/* Database connection etc. */

like = _make_string("%%%s%%", keyword); /* keyword: John */
printf("Like clause: %s\n", like);

sql = _make_string("SELECT COUNT(id) AS nbr FROM user WHERE name LIKE ?");
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
sqlite3_bind_text(stmt, 1, like, -1, SQLITE_STATIC);

if (sqlite3_step(stmt) != SQLITE_ROW) {
    /* error, SQL execution failed */
}
nbr = sqlite3_column_int64(stmt, 1);
printf("Number of record: %u\n", nbr);

/* Free strings, finalize statement, disconnect db etc. */

为简单起见,在代码段中忽略了一些返回值测试。 _make_string(const char *fmt, ...)是类似printf的函数,可以形成字符串,并且确实向我返回%John%

但是,我的代码总是返回0记录。我在sqlite3命令行shell中尝试过SQL,但它找到了2条记录。

请问好吗?

我已经对LIKE子句进行了硬编码并删除了sqlite3_bind_text函数,但它并没有改变结果。

sql = _make_string("SELECT COUNT(id) AS nbr FROM client WHERE name LIKE '%John%'");
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (sqlite3_step(stmt) != SQLITE_ROW) {
    /* error */
}
nbr = sqlite3_column_int64(stmt, 1);
printf("Number of record: %u\n", nbr);

程序总是返回0条记录。

1 个答案:

答案 0 :(得分:0)

好吧,我在SQLite Why bind indexes start from 1 and column indexes start from 0?的邮件列表档案中找到了答案

实际上,绑定索引从1开始,但是列索引从0开始。因此代码应该修改如下

nbr = sqlite3_column_int64(stmt, 0);
printf("Number of record: %u.\n", nbr);

现在程序返回2(记录)!