SQL语句排序nvarchar

时间:2010-05-17 11:15:33

标签: sql

STD-00-1

STD-00-2

STD-00-10

STD-00-1(T)

STD-00-2(T)

STD-00-10(T)

STD-05-1

STD-05-2

STD-05-10

STD-05-1(T)

STD-05-2(T)

STD-05-10(T)

WIP-00-1

WIP-00-1(T)

实现这一目标的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

怎么样?
SELECT * FROM [TABLE] ORDER BY [COLUMN]

下次,请更具体一点。

答案 1 :(得分:2)

您必须解析部件并进行排序。示例查询使用您可以排序的数据创建字段v1, v2, ...v1包含STDv2包含第一个数字,v3如果(T)存在则为1,v4是第二个数字。外部查询然后使用这些字段进行排序,如:

select  YourColumn
from    (
    select  substring(YourColumn,1,3) as v1
    ,       cast(substring(YourColumn,5,2) as int) as v2
    ,       case when YourColumn like '%(T)%' then 1 else 0 end as v3
    ,       cast(replace(substring(YourColumn,8,len(YourColumn)-7),'(T)','') 
                 as int) as v4
    ,       YourColumn
    from    YourTable
) sub
order by v1, v2, v3, v4

对于您的示例数据,返回:

v1  v2  v3  v4  YourColumn     
STD 0   0   1   STD-00-1       
STD 0   0   2   STD-00-2       
STD 0   0   10  STD-00-10      
STD 0   1   1   STD-00-1(T)    
STD 0   1   2   STD-00-2(T)    
STD 0   1   10  STD-00-10(T)   
STD 5   0   1   STD-05-1       
STD 5   0   2   STD-05-2       
STD 5   0   10  STD-05-10      
STD 5   1   1   STD-05-1(T)    
STD 5   1   2   STD-05-2(T)    
STD 5   1   10  STD-05-10(T)   
WIP 0   0   1   WIP-00-1       
WIP 0   1   1   WIP-00-1(T)    

可能需要进行额外调整。

答案 2 :(得分:1)

最好的方法是你应该只在你的sql查询中实现。

select name from table_name ORDER By name

答案 3 :(得分:1)

@Andomar's answer如果您无法更改架构。

如果您可以更改架构,我建议最好的做的事情是:

  • 将不同的部分分成不同的部分,根据他们实际持有的数据进行适当的输入
  • 用于维护现有功能,使用新的计算列作为其连接,使用-分隔符并根据需要进行转换
  • 如果要排序,请分别
  • ORDER BY