SQL Server 中的 ORDER BY ... COLLATE

Posted

技术标签:

【中文标题】SQL Server 中的 ORDER BY ... COLLATE【英文标题】:ORDER BY ... COLLATE in SQL Server 【发布时间】:2012-11-29 02:55:30 【问题描述】:

在 SQL Server 下。一个表格包含一些不同大小写的文本。我想对它们进行区分大小写的排序,并认为ORDER BY 中的COLLATE 可以做到这一点。它没有。为什么?

CREATE TABLE T1 (C1 VARCHAR(20))
INSERT INTO T1 (C1) VALUES ('aaa1'), ('AAB2'), ('aba3')

SELECT * FROM T1 ORDER BY C1 COLLATE Latin1_General_CS_AS
SELECT * FROM T1 ORDER BY C1 COLLATE Latin1_General_CI_AS

两个查询返回相同,即使第一个是“CS”以区分大小写

aaa1
AAB2
aba3

(第一种情况,我要AAB2, aaa1, aba3

我的服务器是 SQL Server Express 2008 (10.0.5500),它的默认服务器排序规则是 Latin1_General_CI_AS

数据库的排序规则也是Latin1_General_CI_AS

如果我使用SQL_Latin1_General_CP1_CS_AS 代替Latin1_General_CS_AS,结果保持不变。

【问题讨论】:

【参考方案1】:

因为正确的区分大小写的排序顺序。 Case Sensitive Collation Sort Order 解释了为什么会这样,它与Unicode specifications for sorting 有关。 aa 将排在AA 之前,但AA 将排在ab 之前。

【讨论】:

【参考方案2】:

您需要一个二进制排序规则来满足您想要的排序顺序,其中A-Z 排在a-z 之前。

SELECT * FROM T1 ORDER BY C1 COLLATE Latin1_General_bin

CS 排序规则排序aAbB ... zZ

【讨论】:

以上是关于SQL Server 中的 ORDER BY ... COLLATE的主要内容,如果未能解决你的问题,请参考以下文章

JPA 和 SQL Server 的 ORDER BY 子句中的列无效

SQL Server 2012 中的 group_concat 与 ORDER BY 另一列

Sql server - 窗口函数只能出现在 SELECT 或 ORDER BY 子句中

简述SELECT语句中的FROM、WHERE以及ORDER BY子句的作用。SQL Server

SQL Server order by 子句不使用 top 等

使用带有 ORDER BY 的 SQL Server 查找累积总和