如何使用SQL Order By语句对不区分大小写的结果进行排序?


144

我有一个SQLite数据库,试图按字母顺序排序。问题是,SQLite似乎在排序期间不考虑A = a,因此我得到如下结果:

A B C T a b c g

我想得到:

A a b B C c g T

需要执行哪些我不知道的特殊SQL事情?

SELECT * FROM NOTES ORDER BY title

2
而更有效的方法是什么呢?“按标题排序NOCASE排序”或“按小标题排序”。(仅供参考,在我看来,该版本运行在Android上,即SQLite上)
Pascal

Answers:


253

您也可以ORDER BY TITLE COLLATE NOCASE

编辑:如果需要指定ASCDESC,请在NOCASE喜欢之后添加

ORDER BY TITLE COLLATE NOCASE ASC

要么

ORDER BY TITLE COLLATE NOCASE DESC

8
“按标题排序NOCASE排序”是否比“按较低标题排序”更有效?
Pascal 2014年

真烂!是不是 哇!为什么糟糕的SQLite使其区分大小写...。很不幸!
'18

1
@Vincy:我不知道区分大小写的字符串比较有什么奇怪之处。这是怎样的<==等运营商在默认情况下所有的编程语言,我很熟悉的工作。
dan04

@ dan04您多久需要一个必须区分大小写的字符串?这就是为什么它很荒谬。世界上谁在关心字符串排序时的情况?我唯一看到的优势是身份验证或密码验证!这就是为什么默认情况下它必须是不区分大小写的,imo!
万象'18

如果数据库使用UTF8,则通常开箱即用。(请注意,标题不仅仅指SQLite。)在这种情况下,建议使用下面的lower()或upper()。
marco '18

99

您可以将所有内容都转换为小写以进行排序:

SELECT * FROM NOTES ORDER BY LOWER(title);

如果要确保大写字母仍然领先于小写字母,只需将其添加为辅助排序即可:

SELECT * FROM NOTES ORDER BY LOWER(title), title;

1
我按多列排序,是否必须将LOWER放在每列附近?
CodeFusionMobile

2
是的,无法将ORDER BY的行为更改为不区分大小写。
乍得伯奇

1
“上”和“下”之间有什么区别
Jagadeesh 2013年

2
为此,它们两者都不会达到相同的效果,即使所有项目的情况相同。
本·巴伦

1
它们仅在字符[] ^ _`上有所不同。
2014年

0
SELECT * FROM NOTES ORDER BY UPPER(title)              

14
感谢您的回答。但是:一个好的答案总是可以解释这样做的原因以及为什么这样做,不仅对OP而言,对于将来的SO访客也是如此。
B001ᛦ16年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.