FMDatabase 是不是存在“NOT IN”问题或 iPhone 上的 SQLite 不支持它?

Posted

技术标签:

【中文标题】FMDatabase 是不是存在“NOT IN”问题或 iPhone 上的 SQLite 不支持它?【英文标题】:Is FMDatabase having troubles with "NOT IN" or doesn't SQLite on iPhone support it?FMDatabase 是否存在“NOT IN”问题或 iPhone 上的 SQLite 不支持它? 【发布时间】:2011-05-27 08:20:08 【问题描述】:

我在使用 FMDatabase 时遇到了一个严重问题。我正在使用如下查询

SELECT * FROM `article` WHERE `alias` NOT IN ('example_alias')

我使用“NOT IN”是因为可能有一个我想要排除的别名列表来代替“example_alias”。但奇怪的是,这个查询的结果包括我想要排除的别名的所有记录。所以 FMDatbase 选择了错误的记录。如果我将此查询复制并粘贴到 SQLite 数据库浏览器中并在那里执行,则查询正确完成。 如果我删除“IN”前面的“NOT”,则 SQLite 数据库浏览器将向我显示具有给定别名的所有记录,并且正如预期的那样,FMDatabase 将向我提供所有没有它们的记录... 在下一步中,我想将 SELECT 替换为 DELETE,但如果保留所有不需要的记录并且删除我想要保留的记录,这确实会造成伤害。 这是 FMDatabase 或底层 SQLite 框架的已知错误(我使用的是 libsqlite3.dylib)还是我做错了什么?

【问题讨论】:

SQLite 肯定能正确处理 NOT IN,而且我无法相信 FMDB 会出现如此根本性的错误。能否给出文章的 DDL 语句,以及内容的 DML 语句? 经过数小时的尝试和错误,我终于找到了我的错误。与其说是对机制工作原理的误解,不如说是错误。我用了“?”在我的查询中使别名列表更加动态。我通过附加以逗号分隔的字符串并修剪最后一个逗号来构建此列表。最后字符串看起来像“'alias1','alias2','alias3'”。该字符串是为“?”插入的。但替换“?”的机制其分配的内容包括一些转义功能,这些功能将我的值字符串列表作为单个值处理,因此没有这个大别名字符串的所有记录都被返回。 【参考方案1】:

在 foxpro 中,子查询需要指定为另一个 sql select 语句 .. SELECT * FROM article WHERE alias NOT IN (select * from 'example_alias') 这可能是解决方案吗?

【讨论】:

你的提示不是我问题的答案,而是给了我一个有用的提示,我可以在哪个方向上引导我的尝试。作为对您的回答的反应,我尝试以不同于通常的“?”的另一种方式将列表插入“NOT IN”括号中。这导致了预期的结果。 好的,你能告诉我你最终得到的代码吗,我很想学习!谢谢 1. NSString *aliasList = [NSString stringWithString:@""]; 2.(在for循环内)aliasList = [aliasList stringByAppendingFormat:@"'%@',",@"next_alias"]; 3. aliasList = [aliasList stringByReplacingCharactersInRange:NSMakeRange([aliasList length] - 1, 1) withString:@""]; 4. [db executeUpdate:[NSString stringWithFormat:@"DELETE FROM article WHERE type = ? AND menualias NOT IN (%@)", aliasList], [NSNumber numberWithInt:TYPE_ARTICLE]];

以上是关于FMDatabase 是不是存在“NOT IN”问题或 iPhone 上的 SQLite 不支持它?的主要内容,如果未能解决你的问题,请参考以下文章

SQLite `NOT IN` 参数是不是有大小限制?

JavaScript 中是不是有用于检查对象属性的“not in”运算符?

在 PostgreSQL 中使用 LEFT JOIN 而不是 NOT IN

如何查看以下 FMDatabase executeUpdate 语句是不是成功?

LayerKit 的 newConversationWithParticipants 总是在第一次调用时抛出 FMDatabase “不是错误”

Python3基础 list in/not in 判断变量是否存在列表中