在Select查询中用其值替换变量

时间:2012-05-20 14:25:35

标签: objective-c sql ios sqlite

这是我的情况,我想在选择查询中使用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提前:))

2 个答案:

答案 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}}。此外,如果您正在处理字符串值,则需要将每个字符串括在单引号中(并通过加倍转义 - 任何嵌入的单引号)。