2012-02-13 45 views
3

我有一个SQL Server 2005中包含字母或数字的NVARCHAR(255)列。排序依据为SQL Server中的NVARCHAR列

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 

感谢

+0

查询返回正确的结果。数据库使用丹麦字母! – 2012-07-18 14:06:09

回答

3

结果的实际顺序将是:

1 
10 
2 
3 
aaaa 
cca 
ccaa 
ccaaaaa 
cccc 

和SQL Server就是这样的排序,因为它是越来越排序基于他们的性格价值。换言之,字符12之前,因为10也将在2之前出现。

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

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

+0

如果你提出一个解决方法* coughcoughCASEcoughcough * :)我会upvote – JNK 2012-02-13 18:34:35

+0

@JNK啊,阿德里安打我吧! :) – 2012-02-13 18:37:13

+0

@JNK你可能想看看我的答案;) – 2012-02-13 18:39:02

4

@Shark表明你为什么,我带你四处逛逛工作在SELECT得到你想要的结果:

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

不错的解决方案,+1。 – 2012-02-13 18:37:31

+0

@Shark这是一个团队的工作,而你正在研究“为什么”,我正在研究“如何”:) – 2012-02-13 18:38:45

+0

哈哈好点,T.E.A.M. (大家一起获得更多)。 :) – 2012-02-13 18:39:46