在t-Sql中排序nvarchar列

时间:2013-10-05 10:11:13

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

我的nvarchar列包含以下数据:

1.0  
10.0      
10.1      
5.1       
6.4       
5.3       
90.5      
39.23     
23.2.2    
21.2.1    
4.3.1 

当我将其作为字符串订购时,我得到以下结果:

1.0       
10.0      
10.1      
21.2.1    
23.2.2    
39.23     
4.3.1     
5.1       
5.3       
6.4       
90.5  

select * from mytable order by mycolumn

这是错误的,它应该将集合排序为数字,例如:

1.0
1.1
1.2
2.3
2.3.1

等。

如何正确排序?我会感激任何帮助!

1 个答案:

答案 0 :(得分:3)

如果您需要按数字排序,应该更好地将数据存储为数字。将零件存储在三列中,然后您可以查询ORDER BY n1, n2, n3 您可以添加computed column以返回完整的字符串,例如用公式

=convert(nvarchar(10), n1) + '.' + convert(nvarchar(10), n2) + 
CASE WHEN n3 IS NOT NULL THEN '.' + 
convert(nvarchar(10), n3) ELSE '' END

当然你可以让dbms反汇编一个字符串,并在每个查询中查找并将部分转换为数字,但这样会“慢”且效率低下。

编辑

正如Martin Smith的评论中的链接,以及我还不知道的那些 - 你实际上可以直接用

来做
ORDER BY CONVERT(HIERARCHYID, '/' + myColumn + '/')