SQL Server中的NVARCHAR列的排序依据

时间:2012-02-13 18:23:25

标签: sql sql-server tsql sql-order-by

我在SQL Server 2005中有一个包含字母或数字的NVARCHAR(255)列。

Declare @Temp Table(Name NVARCHAR(255))

Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('ccaaaaa')
Insert Into @Temp Values('cca')
Insert Into @Temp Values('cccc')
Insert Into @Temp Values('ccaa')

Select * From  @Temp Order by Name

此查询返回错误结果。有人可以解释一下原因吗? 此外,有人可以告诉我使用哪个查询来排序值 我想得到下一个序列:

1
2
3
10
aaaa
cca
ccaa
ccaaaaa
cccc

由于

2 个答案:

答案 0 :(得分:4)

@Shark向您展示了原因,我会告诉您在SELECT中的工作,以获得您想要的结果:

Select * From  @Temp 
Order by 
    case isnumeric(name) 
       when 1 then cast(name as int) 
       else 999999999999999 end, 
    name

答案 1 :(得分:3)

结果的实际顺序如下:

1
10
2
3
aaaa
cca
ccaa
ccaaaaa
cccc

SQL Server正在对它进行排序,因为它是根据字符值进行排序的。换句话说,字符1位于2之前,10也位于2之前。

所以你得到奇怪的排序的原因是因为你是按字符串值排序,而不是数字。

编辑:请参阅Adrian对解决方法的回答。