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