2013-06-21 16 views
1

我試圖安排與類似值的列:與數字和連字符的數值排列列

6-3 
11-1 
3 
8-5 
5 
6-2 
1 
7 
11-4 
8-12 
2 

我希望他們能夠安排是這樣的:

1 
2 
3 
5 
7 
6-2 
6-3 
8-5 
8-12 
11-1 
11-4 

我有這個疑問現在:

select column_name from database_name.dbo.table_name 
order by 
(case when (BOX_NO not like '%-%') 
then -1 when (BOX_NO like '%-%') 
then cast(SUBSTRING(reverse(BOX_NO), LEN(BOX_NO)-(CHARINDEX('-', reverse(BOX_NO))-2), 0) as int) end), 
(case when (column_name not like '%-%') 
then cast(column_name as int) 
when (column_name like '%-%') 
then cast(SUBSTRING(column_name, LEN(column_name)-(CHARINDEX('-', reverse(column_name))-2), 8000) as int) end) 

我要瘋了。如果有人能幫助我,那會很好。謝謝!

回答

0

Woopsy daisies!現在一切都很好。第一個案件是錯誤的。不應該有第二次倒退。搜索應該從8000開始,而不是0.我的不好!

(case when (column_name not like '%-%') then 0 when (column_name like '%-%') then cast(SUBSTRING(reverse(column_name), LEN(column_name)-(CHARINDEX('-', column_name)-2), 8000) as int) end), 
0
declare @test table (value varchar(10)) 

insert @test values ('6-3'), 
    ('11-1'), 
    ('3'), 
    ('8-5'), 
    ('5'), 
    ('6-2'), 
    ('1'), 
    ('7'), 
    ('11-4'), 
    ('8-12'), 
    ('2') 

select 
    T2.value, 
    case when CHARINDEX('-', T1.value) = 0 then cast(T1.value as int) else cast(LEFT(T1.value, CHARINDEX('-', T1.value) - 1) as int) end, 
    case when CHARINDEX('-', T1.value) = 0 then 0 else cast(substring(T1.value, CHARINDEX('-', T1.value) + 1, 10) as int) end 
from @test T1, @test T2 
where T1.value = T2.value 
order by 2, 3