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

Posted

技术标签:

【中文标题】如何使用 SQL Order By 语句对结果进行排序,不区分大小写?【英文标题】:How to use SQL Order By statement to sort results case insensitive? 【发布时间】:2011-01-25 16:28:06 【问题描述】:

我有一个 SQLite 数据库,我正在尝试按字母顺序排序。问题是,SQLite 在排序过程中似乎没有考虑 A=a,因此我得到这样的结果:

一个 乙 C 吨 一种 b C g

我想得到:

一个 一种 b 乙 C C G T

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

SELECT * FROM NOTES ORDER BY title

【问题讨论】:

还有什么更有效的方法呢? “ORDER BY TITLE COLLATE NOCASE”或“ORDER BY LOWER(TITLE)”。 (仅供参考,在我的情况下,在 android 上运行,即 SQLite) 【参考方案1】:

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

SELECT * FROM NOTES ORDER BY LOWER(title);

如果您想确保大写字母仍然排在小写字母之前,只需将其添加为辅助排序:

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

【讨论】:

我按多列排序,是否必须在每一列周围放置 LOWER? 是的,没有办法将 ORDER BY 的行为更改为不区分大小写。 'UPPER'和'LOWER'有什么区别 为了这个目的,不,它们都将达到相同的效果,即使所有项目的大小写相同。 它们仅在字符 []^_` 上有所不同。【参考方案2】:

你也可以ORDER BY TITLE COLLATE NOCASE

编辑:如果您需要指定ASCDESC,请在NOCASE 之后添加此内容

ORDER BY TITLE COLLATE NOCASE ASC

ORDER BY TITLE COLLATE NOCASE DESC

【讨论】:

“ORDER BY TITLE COLLATE NOCASE”比“ORDER BY LOWER(TITLE)”更有效吗? 太糟糕了!不是吗?哇!为什么 SQLite 让它在排序时区分大小写......不适合我的想法......不幸的是! @Vincy:我看不出区分大小写的字符串比较有什么奇怪的地方。这就是<== 等运算符在我熟悉的每种编程语言中默认工作的方式。 @dan04 您多久需要一个必须区分大小写的字符串?这就是为什么它很荒谬。世界上谁在对字符串进行排序时关心大小写?我看到的唯一优势是身份验证或密码验证!这就是为什么默认它必须是不区分大小写的,imo! 如果数据库使用 UTF8,这通常不会开箱即用。 (请注意,标题不仅仅指 SQLite。)在这种情况下,下面使用 lower() 或 upper() 的建议是可行的。【参考方案3】:
SELECT * FROM NOTES ORDER BY UPPER(title)              

【讨论】:

感谢您的回答。但是:好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅适用于 OP,也适用于 SO 的未来访问者。

以上是关于如何使用 SQL Order By 语句对结果进行排序,不区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章

SQL的order by语句

SQL Order By 子句详解

SQL-W3School:SQL ORDER BY 子句

SQL语句 ORDER BY HAVING GROUP BY WHERE 等区别

SQL语句 ORDER BY HAVING GROUP BY WHERE 等区别

sql里的排序倒序的命令是order by啥