【发布时间】:2011-10-10 19:17:11
【问题描述】:
我有一个 SQL 表,其中一列有几个逗号分隔值。如果列表中存在特定值,则下面的代码应该遍历所有这些并返回 true,但是它似乎仅适用于条目中第一个值以外的值。关于我在哪里搞砸的任何想法?使用 sqlite3 直接在数据库文件上运行时,查询工作正常,所以我确定问题出在这个函数上。
bool group_exists(char *group)
{
int retv;
char *param_1, *param_2;
bool exists = false;
sqlite3_stmt *p_stmn;
param_1 = malloc(BUFFER_SIZE);
param_2 = malloc(BUFFER_SIZE);
sprintf(param_1, "%s,%%", group);
sprintf(param_2, "%%,%s,%%", group);
sqlite3_prepare_v2(db, "SELECT groups FROM users WHERE groups LIKE ? OR groups LIKE ?", -1, &p_stmn, NULL);
sqlite3_bind_text(p_stmn, 1, param_1, -1, NULL);
sqlite3_bind_text(p_stmn, 1, param_2, -1, NULL);
retv = sqlite3_step(p_stmn);
if (retv == SQLITE_ROW) {
exists = true;
} else if (retv != SQLITE_DONE) {
retval_crash();
}
free(param_1);
free(param_2);
sqlite3_finalize(p_stmn);
return exists;
}
【问题讨论】:
-
逗号有必要吗?显示您在没有
?s 的情况下在 sqlite3 中使用的预期/工作查询,以便我可以理解您试图实现的类似语句。如果可用,也使用snprintf,并检查sqlite3_prepare_v2以获得SQLITE_OK -
查询是“SELECT groups FROM users WHERE groups LIKE '%,foobar,%' OR groups LIKE 'foobar,%'”,其中 foobar 是我要检查的组。问题是该字段包含一个逗号分隔的值列表,例如,“foobar”不应该匹配“foo,foobarba”。我知道从 SQLite 获取整个字符串,然后在 C 中匹配它可能会更整洁,但这会使代码的其他部分复杂化,所以我希望改为解决这个问题。
-
问题是该字段包含一个逗号分隔的值列表停在那里并在值之后放置一个句点。一旦解决了直接的
sqlite3_bind_text索引问题,您可能需要查看您的架构。