SQLite - 按字母数字排序同时忽略特殊字符和 "The"

标签 sql ios sqlite indexing

我正在开发一个 iOS 应用程序,该应用程序使用 FMDB 来存储书名列表,这些书名必须按字母数字顺序排序(字母在前,数字在后)。但是,我还必须忽略非字母数字前导字符,例如星号或括号。我也必须忽略“The”。此外,排序后的数据将显示在索引的 UITableView 上,因此我需要能够获得前导字符列表和每个部分的书名数量。

例子-

这是一个书名列表:

"A Title 1", "A Title 2", "The A Title 3", "B Title 1", "B Title 2", "B Title 3", 
"*B Title 4", "C Title 1", "(The) C Title 2", "3 Title 1"

从这个列表中,我会算出 4 个部分来放置标题('A'、'B'、'C'、'3')。我还会计算每个部分的书籍数量('A'-3 本书,'B'-4 本书,'C'-2 本书,'3'-1 本书)。使用 this tutorial我能够设置章节和索引,但在处理“The A Title 3”、“*B Title 4”和“(The) C Title 2”等标题时遇到问题。

目前,这是我正在使用的语句:

SELECT DISTINCT UPPER(SUBSTR(BookTitle, 1, 1)) AS Section, 
COUNT(BookTitle) AS SectionCount 
FROM BookTable 
GROUP BY Section ORDER BY IFNULL(Section + 1, 0), Section

这将返回按字母数字排序的部分列表以及进入每个部分的书籍数量。问题是我的“T”部分中的书太多了,因为它得到了所有以“The”为主角的书。更不用说当我想忽略这些特殊字符时,我会得到像 < 或 * 这样的部分。我在想我需要删除任何非字母数字字符和任何出现的“The”,但我不知道如何将它集成到我的查询中,就像现在一样。

我希望这足够详细。请随时让我清理任何东西。一如既往,提前致谢。

最佳答案

最好的选择可能是在插入时检查这些条件,并将“The”放在标题的末尾(例如,“A Title 3, The”)。您可以编写一个简单的程序来更新当前数据库并将“The”添加到末尾。

但如果您真的想保持这种方式,请查看 case 表达式。这是一个相关主题: Does sqlite support any kind of IF(condition) statement in a select

基本上,检查“The”或特殊字符的大小写,并在您的 SUBSTR 中使用该大小写。

关于SQLite - 按字母数字排序同时忽略特殊字符和 "The",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11494643/

相关文章:

MySQL 查询 - 计算不引用自身的记录数

ios - ios 8.4模拟器在xcode 6.4中非常大吗?

ios - NSOperation completionBlock 被调用了两次

android - 可以依赖 SQLiteConstraint 并让 SQLite 为我进行检查吗?有陷阱吗?

sql - 在不支持 IF EXISTS 的旧版本 SQLite 中删除表

mysql - 使用 AUTO_INCREMENT 创建与 SQLite 和 mysql 兼容的 SQL

MYSQL DATE_FORMAT 返回额外的日期加上自定义时间

c# - 必须使用 OUTPUT INTO 声明标量变量 '@ID'

iphone - iOS NSJSON 返回空值

python - 在 Linux 到 Windows (Flask) 中将模式管道传输到 sqlite 的对应物是什么