2010-05-17 81 views
3
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) 

實現此目的的最佳方法是什麼?SQL Statement sorting nvarchar

回答

1

最好的辦法是,你應該只在你的SQL查詢中存檔。

select name from table_name ORDER By name 
2

什麼

SELECT * FROM [TABLE] ORDER BY [COLUMN] 

下一次,請更具體一點。

+0

這將在'STD-00-2'之前放置'STD-00-10' – Quassnoi 2010-05-17 12:26:18

2

您必須解析零件並進行分類。示例查詢使用可以排序的數據創建字段v1, v2, ...v1包含STDv2包含第一個數字,v3爲1如果存在(T),並且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)  

附加的調整可能是必需的。

1

@Andomar's answer如果您無法更改架構。

然而,如果你可以更改架構,我建議最好的事情是:

  • 分離出不同的部分爲單獨的列,適當地輸入到他們實際保存數據
  • 維持現有的功能,有一個新的計算列那是他們的串聯,與-分離器和鑄造適當
  • ORDER BY當你想分類時,分開的列