私は、カラムの1つに複数のカンマ区切りの値があるSQLテーブルを持っています。以下のコードは、すべての値を調べ、特定の値がリストにある場合はtrueを返しますが、エントリの最初の値以外の値でしか機能しないようです。私がどこで悩んだのかについてのアイデアは?クエリは、sqlite3を使用してデータベースファイル上で直接実行するとうまく動作するので、問題はこの関数にあると確信しています。CプログラムからのSQLiteクエリのデバッグ
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;
}
コンマは必要ですか? '?' 'なしでsqlite3で使用した期待された/働いているクエリを表示して、達成しようとしているような文を理解できます。 SQLite_OK](http://www.sqlite.org/c3ref/c_abort.html)の 'sqlite3_prepare_v2'を確認してください。 – Joe
クエリは"グループが好きなグループからのSELECTを選択します '、foobar 、% 'OR groups LIKE' foobar、% '"foobarは私がチェックしているグループです。問題は、フィールドに値のコンマ区切りのリストが含まれており、 'foobar'が 'foo、foobarba'と一致しないようにすることです。私はSQLiteから文字列全体を取得してC言語でマッチングするのはおそらくもっと控え目だが、それはコードの他の部分を複雑にするので、代わりにこれを修正したいと思っている。 – befuddled
*問題は、フィールドにカンマで区切られた値のリストが含まれていることです。*すぐそこに停止し、*値*の後にピリオドを入れます。即座に 'sqlite3_bind_text'インデックスの問題を乗り越えたら、あなたのスキーマを見直したいかもしれません。 –