在 t-Sql 中对 nvarchar 列进行排序

4

我有一个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

如何正确排序?非常感谢任何帮助!


4
“which is wrong," - no, that's how it's designed! :)” 的翻译是:“那是错误的”- 不,那就是它的设计方式! :) - Mitch Wheat
好的,那么如何手动重新设计它呢? :) - Gyuzal
1个回答

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

当然,你可以让数据库管理系统在每个查询时拆分字符串并查找并转换其中的数字,但这种方法会“缓慢”且效率低下。
编辑:
正如Martin Smith评论中提到的链接,我之前不知道-实际上你可以直接使用。
ORDER BY CONVERT(HIERARCHYID, '/' + myColumn + '/')

谢谢,我也有同样的猜测,但希望有另一种更有效的方法。 - Gyuzal
转换 nvarchar 为 numeric 时出现错误,因此 'ORDER BY CAST('/' + YourColumn + '/' AS HIERARCHYID)' 完美地解决了这个问题。 - Gyuzal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接