我很难搞清楚如何按照我想要的方式自定义数据排序。这意味着它应该是这样的:
201-1-1
201-1-2
201-1-3
.......
201-2-1
等等,如果你知道我的意思。
相反,我在代码下执行此类操作:
select *
from test.dbo.accounts
order by account_name asc
输出:
201-10-1
201-10-2
201-1-1
201-11-1
201-11-2
201-11-3
201-11-4
201-11-6
201-1-2
201-12-1
201-12-2
201-12-3
201-12-4
201-12-6
201-1-3
201-13-1
201-13-2
201-13-3
201-13-4
201-13-6
201-1-4
201-14-1
201-14-2
201-14-4
201-14-6
201-15-1
201-15-2
201-15-3
201-15-4
201-15-6
201-1-6
201-16-1
201-16-2
201-16-3
201-16-4
201-16-6
201-16-7
201-1-7
201-17-1
201-17-2
201-17-4
201-17-6
201-18-1
201-18-2
201-18-3
201-18-4
201-18-6
201-19-1
由于
答案 0 :(得分:3)
对于您的样本数据,以下技巧将起作用:
order by len(account_name), account_name
这只能起作用,因为唯一的可变长度组件是第二个组件,因为连字符比数字“小”。
您应该对帐户名称进行规范化,以使所有组件的长度相同,左边用零填充数字。
答案 1 :(得分:2)
唉。 SQL中的字符串操作非常麻烦。可能有更好的方法来做到这一点,但这似乎有效。
select accoutn_name
from test.dbo.accounts
order by left(account_name,charindex('-',account_name,1)-1)
,replace(right(left(account_name,CHARINDEX('-',account_name,1)+2),2),'-', '')
,REPLACE(right(account_name,2),'-','')
顺便说一下,这是一个非常昂贵的运行过程。如果它已经生产,那么您将想要找到更好的解决方案。