2009-07-27 102 views
16

我有一個查詢sqlite3數據庫,它提供了排序的數據。數據根據列爲「名稱」的列進行排序。現在當我做查詢時如何更改sqlite3數據庫的排序規則來不區分大小寫?

select * from tableNames Order by Name; 

它提供了這樣的數據。

 
    Pen 
    Stapler 
    pencil 

意味着它正在考慮區分大小寫的東西。我想要的方式如下

 
    Pen 
    pencil 
    Stapler 

那麼,我應該在sqlite3數據庫中做出什麼樣的改變來獲得必要的結果呢?

相關How to set Sqlite3 to be case insensitive when string comparing?

回答

10

SQLite的Datatypes documentation討論用戶定義的歸類序列。具體而言,您使用COLLATE NOCASE來實現您的目標。

他們舉一個例子:

CREATE TABLE t1(
    a,     -- default collation type BINARY 
    b COLLATE BINARY, -- default collation type BINARY 
    c COLLATE REVERSE, -- default collation type REVERSE 
    d COLLATE NOCASE -- default collation type NOCASE 
); 

,並注意:

- 使用NOCASE排序順序進行分組(即值 - 'ABC' 和 'ABC' 被放置在同一組)。 SELECT count(*)GROUP BY d FROM t1;

+2

志 「COLLATE NOCASE」 工作任何語言?如果不是,那麼如果在編譯時不知道特定語言,如何以不區分大小寫的方式在文本字段上進行排序? – 2009-07-29 23:15:10

+0

IIRC sqlite3本身是UTF-8,因此應根據Unicode UTF-8規則進行整理。當然,這可能不是用戶期望的內容... – 2009-07-29 23:27:59

+0

@moodforaday:沒有用內置的NOCASE整理。您可以重新定義應用程序中的NOCASE排序規則,並根據當前系統/用戶區域設置進行排序。只需將您的自定義歸類命名爲「NOCASE」即可。 – wqw 2011-06-17 14:45:50

2
select * from tableNames Order by lower(Name); 

Michael van der Westhuizen在他的評論中解釋了爲什麼這不是一個好方法。我要離開這個答案了,以保持他的意見,並作爲一個警告,其他人誰可能具有相同的「光明」的想法,我有;-)

+0

這不是一個好主意 - 通過函數排序,如果沒有基於函數的索引,將導致性能和可伸縮性問題。請參閱上面Dror Harari的回答,以便在sqlite3中執行此操作。 如果您在較低(名稱)上使用帶有基於函數的索引的Oracle,則可以,但在這種情況下不會。 – 2009-07-29 22:46:16

20

對它進行排序不區分大小寫,您可以使用ORDER BY Name COLLATE NOCASE

1

在SQLite數據庫使用此聲明:

PRAGMA case_sensitive_like = false 
+1

區分大小寫對於ASCII字符而言已經爲false,並且默認情況下區分超出ASCII範圍的unicode字符。 [鏈接](http://www.sqlite.org/lang_expr.html) – 2012-04-16 13:43:26

相關問題