如何使用 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
。
编辑:如果您需要指定ASC
或DESC
,请在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 HAVING GROUP BY WHERE 等区别