【问题标题】:Replacing a variable by its value in a Select query在 Select 查询中用变量的值替换变量
【发布时间】:2012-05-20 14:25:34
【问题描述】:

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

显然,我想在带有bind 语句的查询中使用arrayThemeList

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

【问题讨论】:

    标签: objective-c sql ios sqlite


    【解决方案1】:

    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' )
    

    【讨论】:

    • 嗨,谢谢你的回复 :) 不幸的是,我什么都没得到 :(
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多