这是我的情况,我想在选择查询中使用NSString变量:
NSString *arrayThemeList=@"element1, element2, element3";
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat:
@"SELECT * from table1 where type IN ?"];
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(contactDB,
query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
sqlite3_bind_text(statement, 1, [arrayThemeList UTF8String], -1, SQLITE_TRANSIENT);
while (sqlite3_step(statement) == SQLITE_ROW)
{
//Do the rest work...
显然,我想使用arrayThemeList
语句将bind
用于查询。
但是,这似乎没有给出想要的结果,我有什么问题吗? Thanx提前:))
答案 0 :(得分:0)
IN子句应将条目括在括号中。尝试:
NSString *querySQL = [NSString stringWithFormat:
@"SELECT * from table1 where type IN ( ? )"];
此外,您的字符串需要包含在内,因此请将第一行更改为:
NSString *arrayThemeList=@"'element1', 'element2', 'element3'";
生成的查询应为:
SELECT * from table1 where type IN ( 'element1', 'element2', 'element3' )
答案 1 :(得分:0)
如果要将变量绑定到IN列表的某些部分,则需要在IN列表周围添加一些括号,并且每个单独的值必须有一个占位符(问号):
SELECT * FROM table1 WHERE type IN (?, ?, ?);
然后绑定三个单独的值,每个占位符一个。没有办法(在大多数SQL DBMS中,我认为也不在SQLite中)将值列表绑定到单个占位符。
如果您只将数据作为单个字符串获取,那么您必须在准备语句之前格式化SQL,并且放弃使用不同值重用预准备语句的能力,并且您必须担心{ {3}}。此外,如果您正在处理字符串值,则需要将每个字符串括在单引号中(并通过加倍转义 - 任何嵌入的单引号)。