2009-07-27 103 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

相关问题