2012-07-15 38 views
3

我正在使用FMDB存儲的書籍必須字母數字排序的標題列表的iOS應用(阿爾法第一,第二號)。但是,我還必須忽略非字母數字的主要字符,例如星號或括號。我也必須忽略「The」。另外,這個排序的數據將顯示在一個索引的UITableView上,所以我需要能夠得到主要字符的列表和每個章節中的書名。SQLite的 - 排序的字母數字而忽略特殊字符和「的」

例 -

這本書的標題列表:

"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」的出現,但我不知道如何將它集成到我的查詢中,因爲它現在是。

我希望這足夠詳細。請隨時要求我澄清任何事情。一如既往,先謝謝你。

+0

您通常需要創建第二個「已清理」標題列。它可以純粹用於查詢,然後在顯示結果時返回原始列。 – 2012-07-15 19:05:11

+0

@HotLicks是的,這就是我的想法。我只是不確定所需的語法或在哪裏可以找到SQLite函數的完整列表。 – Squatch 2012-07-15 19:19:24

+0

您不需要任何新語法就可以將另一列添加到數據庫中。只需在創建第一列數據時創建第二列數據,並將兩者一起插入。然後,而不是搜索第一個匹配,搜索第二個。但在您檢索的列中包含第一列。 – 2012-07-16 00:58:46

回答

1

最好的選擇可能是檢查在插入這些情況,並把「了」在標題的結尾(例如,「A標題3,」)。你可以編寫一個簡單的程序來更新當前的數據庫和mote「The」到最後。

但是,如果你真的想保持這種方式,請查看案例表達式。這裏是一個相關的主題: Does sqlite support any kind of IF(condition) statement in a select

基本上,檢查大小寫或特殊字符,並在你的SUBSTR中使用這種情況。

1

與其他語言相比,SQL中的字符串操作通常是「迴歸基礎」。以下是您可能採用的一種方法:

select upper(substring(titleclean, 1, 1)) as Section, count(*) 
from (select bt.*, 
      (case when upper(substring(titletrim, 1, 4)) = 'THE ' or 
         upper(sutring(titletim, 1, 5)) = 'THE) ' 
        then substring(titletrim, 5, 1000) 
        else titletrim 
       end) as titleclean 
     from (select bt.*, ltrim(title, '()*') as titletrim 
      from booktable bt 
      ) bt 
    ) bt 
group by upper(substring(titleclean, 1, 1)) 
order by (case when substring(titleclean, 1, 1) between '0' and '9' then 1 
       else 0 
      end), 
     Section 

這是通過在子查詢中分配變量來執行字符串操作。我認爲這些遵循你想要的規則。最裏面的ltrim()是刪除你不想要的初始變量。

我改變的表達 「IFNULL(第+ 1,0)」,以更清晰的範圍比較。你的版本可能在SQLite中工作。在大多數數據庫中,它將爲非數字部分生成錯誤。

+0

謝謝。 SQLite的語法有點有限,所以我會看看我是否可以得到這個翻譯。 – Squatch 2012-07-16 00:10:13