如何解决在此示例中,MSSQL 中的字符的 ORDER BY 是如何工作的?
我试图了解 order by 是如何工作的。在 SQL Heads down 一书中,作者提到大写字母在选择和排序时应该显示在小写字符的“之前”。
为什么字母不按顺序显示: AaBbCcDd 而不是 AabBCcdD?
值得一提的是,作者在 MySQL 中给出了示例,我使用的是 MSSQL。
解决方法
您应该检查数据库中的 collation order:看起来当前的只是将相同字符的大写和小写版本视为无法区分,因此它们将以任何顺序结束。
这就是为非英语用法开发系统如此可爱的任务的原因:很少有西欧语言同意正确的字母顺序!众所周知,ÅÄÖ 排在最后,而 V 和 W 在排序时无法区分...
,在 SQL Heads down 一书中,作者提到大写字母在选择和排序时应该显示在小写字符的“之前”。
这种说法充其量只是部分正确,实际上是错误的。字符“排序”的顺序与值所在的排序规则以及当它们相等时如何处理这些值有关。采取以下措施:
CREATE TABLE dbo.SomeTable (ID int IDENTITY PRIMARY KEY CLUSTERED,--Gives the RDBMS something else it is likely to ORDER BY,but NOT guarenteed
Insensitive char(1) COLLATE Latin1_General_CI_AI,CaseSensitive AS Insensitive COLLATE Latin1_General_CS_AI,AccentSensitive AS Insensitive COLLATE Latin1_General_CI_AS,CaseAndAccentSensitive AS Insensitive COLLATE Latin1_General_CS_AS,BinaryCollation AS Insensitive COLLATE Latin1_General_BIN,SQLLatin AS Insensitive COLLATE SQL_Latin1_General_CP1_CI_AI);
GO
INSERT INTO dbo.SomeTable
VALUES('a'),('A'),('b'),('B'),('C'),('c'),('D'),('d'),('e'),('E');
GO
SELECT ID,Insensitive
FROM dbo.SomeTable
ORDER BY Insensitive;
GO
SELECT ID,CaseSensitive
FROM dbo.SomeTable
ORDER BY CaseSensitive;
GO
SELECT ID,AccentSensitive
FROM dbo.SomeTable
ORDER BY AccentSensitive;
GO
SELECT ID,CaseAndAccentSensitive
FROM dbo.SomeTable
ORDER BY CaseAndAccentSensitive;
GO
SELECT ID,BinaryCollation
FROM dbo.SomeTable
ORDER BY BinaryCollation;
GO
SELECT ID,SQLLatin
FROM dbo.SomeTable
ORDER BY SQLLatin;
GO
DROP TABLE dbo.SomeTable;
在上面,我们得到了几个不同的订单。首先,使用排序规则 Insensitive
按 Latin1_General_CI_AI
排序,我们会得到与您类似的订单。我已将 ID
包含在 SELECT
中,因为这可能意味着对于如此小的数据集,数据将按 CLUSTERED INDEX
的顺序返回。
对于接下来的Latin1_General_CS_AI
,数据按照小写,大写的顺序返回。 Latin1_General_CI_AS
以与 Insensitive
相同的顺序返回,CaseAndAccentSensitive
以与 Latin1_General_CS_AI
相同的顺序返回。
然后我们有二进制排序规则。对于我选择的Latin1_General_BIN
,顺序是所有大写字符在前,然后是所有小写字符。
最后,我们有 SQL_Latin1_General_CP1_CI_AI
,它确实符合您对大写然后小写的期望。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。