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

162

我有一个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
那么更有效的方法是什么?“ORDER BY TITLE COLLATE NOCASE”还是“ORDER BY LOWER(TITLE)”?(顺便说一句,在我的情况下,运行在Android上,即SQLite) - Pascal
3个回答

279
你也可以使用 ORDER BY TITLE COLLATE NOCASE

编辑:如果需要指定 ASC 或者 DESC,在 NOCASE 之后加上即可。

ORDER BY TITLE COLLATE NOCASE ASC
或者
ORDER BY TITLE COLLATE NOCASE DESC

11
“ORDER BY TITLE COLLATE NOCASE”比“ORDER BY LOWER(TITLE)”更有效吗? - Pascal
这很糟糕!不是吗?哇!为什么SQLite在排序时要区分大小写...我想不通...不幸的是! - Vincy
1
@Vincy:我不明白为什么大小写敏感的字符串比较有什么奇怪的地方。这是我熟悉的每种编程语言中默认情况下 <== 等运算符的工作方式。 - dan04
1
@dan04 你有多频繁需要一个区分大小写的字符串?这就是为什么它很荒谬。在排序字符串时,世界上谁会关心大小写呢?我唯一看到优势的地方是用于身份验证或密码验证!因此,在我看来,默认情况下它应该是不区分大小写的! - Vincy
2
通常情况下,如果数据库使用UTF8,则此方法无法直接奏效(请注意,标题并不仅适用于SQLite)。在这种情况下,建议使用下面的lower()或upper()方法。 - marco
数据库读取速度比以前慢很多,你有什么办法可以提高速度吗? - Yasin Hajilou

113

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

SELECT * FROM NOTES ORDER BY LOWER(title);
如果您想确保大写字母仍然排在小写字母前面,只需将其作为二级排序添加即可。
SELECT * FROM NOTES ORDER BY LOWER(title), title;

1
我正在按多列排序,我需要在每个列名周围加上LOWER吗? - CodeFusionMobile
2
是的,无法更改ORDER BY的行为以使其不区分大小写。 - Chad Birch
2
'UPPER'和'LOWER'之间有什么区别吗? - Jagadeesh
2
为此,它们都将实现相同的效果,即使所有项目的大小写相同。 - Ben Baron
1
它们仅在字符 []^_` 上有所不同。 - dan04
显示剩余2条评论

1
SELECT * FROM NOTES ORDER BY UPPER(title)              

17
感谢您的回答。但是,一个 好的答案 总是应该解释清楚做了什么以及为什么以这种方式进行操作,不仅对于 OP 而言,在未来访问 Stack Overflow 的用户也有帮助。 - B001ᛦ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接