我在SQL Fiddle for this question处有一个简单的SQL小提琴。
问题
我不理解非常基本的东西,即当按升序排序字符串值时,为什么SQL Server会在-sock
之前放置abcx
?
如果有人可以解释数据库引擎所遵循的幕后逻辑,那么这将非常清楚。
我认为较小的长度字符串总是在较长的字符串之前。因此,首先对所有长度为1的字符串进行排序,然后是长度为2的字符串,后跟长度为3的字符串,依此类推。
此问题的脚本如下所示。
abd
答案 0 :(得分:2)
我相信你在这里真正讨论的是SQL Server整理 - 看一下这篇MS文章 - 它适用于SQL 2008,但是对于这一点来说一样好:
答案 1 :(得分:2)
在SQL Server中对(n)varchar
进行排序时,位置中的每个字符都会与相同位置中的字符进行排序。如果(n)varchar
比另一个短,但其第一个字符在字母表后面是另一个值,那么该值将在排序的后面出现。
因此,例如,简单值A
很可能出现在排序顺序的开头。同样地,zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
将出现在结尾附近,因为它的第一个字符是z。
在abd
和abcx
的示例中,首先(n)varchar
按其第一个字符a
排序,然后按第二个字符b
排序。这些都是一样的。但是,第三个字符是c
和d
。字母表中的c
位于字母d
之前,因此ascending
排序顺序abcx
将在abd
之前排序;因为第3个字符在字母表中较早,并且是第一个不同的字符。
编辑:此外,再添加一点。如果(n)varchar
比另一个(n)varchar
短但共享相同的初始字符,则它也会提前排序。因此,例如,值add
将在单词addition
之前排序。