2013-12-12 427 views
1

SQL SERVER 2005 SQL排序:排序varchar數據類型

數據類型爲varchar

應該

1.aaaa 
5.xx 
11.bbbbbb 
12 
15. 

我怎麼能得到這個排序順序

錯誤

排序
1.aaaa 
11.bbbbbb 
12 
15. 
5.xx 
+1

一個簡單的解決方案是將'5.xx'如'005.xx' – Andomar

+0

啊,字母數字的排序:-) –

+0

另一種解決方案的樂趣會將數字前綴和alpha後綴存儲在適當數據類型的單獨列中。 –

回答

1

在Oracle上,這可行。

SELECT 
    * 
FROM 
    table 
ORDER BY 
    to_number(regexp_substr(COLUMN,'^[0-9]+')), 
    regexp_substr(column,'\..*'); 
+0

爲什麼這會得到downvoted? OP沒有指定DBMS。這也給出了可以做什麼的想法。 –

+0

@ThorstenDittmar - 查看編輯歷史。它最初建議'ORDER BY to_number(column)',因爲內容不完全是數字,所以會失敗。 –

+0

@MartinSmith那麼,這是因爲刪除,修改,然後取消刪除。 –

0

如果所有的條目都有這種形式,你可以將它們像這樣分成兩個部分,排序是這些,例如:

ORDER BY 
    CONVERT(INT, SUBSTRING(fieldname, 1, CHARINDEX('.', fieldname))), 
    SUBSTRING(fieldname, CHARINDEX('.', fieldname) + 1, LEN(fieldname)) 

這應該做一個數字排序的前部分..之後的部分使用字母數字排序,但可能需要進行一些調整,因爲我沒有真正嘗試過。

另一種方法(或更快)可能是創建計算列,該列包含.之前和.之後的部分並按它們排序。

第三種方法(如果您不能創建計算列)可能是在表中創建一個視圖,該表有兩個額外的列與字段的相應部分,然後在該視圖上進行選擇。

1

您可以通過根據期間('。')左側的內容計算一列來做到這一點。

但是,除非您能夠對字符串內容進行大量斷言,否則這種方法將非常難以在生產系統中使用。

另外處理字符串而不期間可能會導致一些悲傷

with r as (
select '1.aaaa' as string 
union select '5.xx' 
union select '11.bbbbbb' 
union select '12' 
union select '15.') 

select * 
from r 
order by 
    CONVERT(int, left(r.string, case when (CHARINDEX('.', r.string)-1 < 1) 
            then LEN(r.string) 
            else CHARINDEX('.', r.string)-1 end)), 
    r.string