0

这是我的情况,我想在选择查询中使用 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在语句中使用 into 查询bind

但是,这似乎没有给出想要的结果,我做错了什么吗?提前感谢:)

4

2 回答 2

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' )
于 2012-05-20T14:30:46.103 回答
0

如果要将变量绑定到 IN 列表的某些部分,则需要在 IN 列表周围加上一些括号,并且每个单独的值必须有一个占位符(问号):

SELECT * FROM table1 WHERE type IN (?, ?, ?);

然后绑定三个单独的值,每个占位符一个。没有办法(在大多数 SQL DBMS 中;我认为在 SQLite 中也没有)将值列表绑定到单个占位符。

如果您仅以单个字符串的形式获取数据,那么您将不得不在准备语句之前格式化 SQL,并且您放弃了重用具有不同值的准备好的语句的能力,并且您必须担心SQL 注入。此外,如果您正在处理字符串值,则需要将每个字符串括在单引号中(并转义 - 通过加倍 - 任何嵌入的单引号)。

于 2012-05-20T15:00:30.123 回答