SQL SERVER 2005 SQL排序:排序varchar數據類型
數據類型爲varchar
應該
1.aaaa
5.xx
11.bbbbbb
12
15.
我怎麼能得到這個排序順序
錯誤
排序1.aaaa
11.bbbbbb
12
15.
5.xx
SQL SERVER 2005 SQL排序:排序varchar數據類型
數據類型爲varchar
應該
1.aaaa
5.xx
11.bbbbbb
12
15.
我怎麼能得到這個排序順序
錯誤
排序1.aaaa
11.bbbbbb
12
15.
5.xx
在Oracle上,這可行。
SELECT
*
FROM
table
ORDER BY
to_number(regexp_substr(COLUMN,'^[0-9]+')),
regexp_substr(column,'\..*');
爲什麼這會得到downvoted? OP沒有指定DBMS。這也給出了可以做什麼的想法。 –
@ThorstenDittmar - 查看編輯歷史。它最初建議'ORDER BY to_number(column)',因爲內容不完全是數字,所以會失敗。 –
@MartinSmith那麼,這是因爲刪除,修改,然後取消刪除。 –
如果所有的條目都有這種形式,你可以將它們像這樣分成兩個部分,排序是這些,例如:
ORDER BY
CONVERT(INT, SUBSTRING(fieldname, 1, CHARINDEX('.', fieldname))),
SUBSTRING(fieldname, CHARINDEX('.', fieldname) + 1, LEN(fieldname))
這應該做一個數字排序的前部分.
和.
之後的部分使用字母數字排序,但可能需要進行一些調整,因爲我沒有真正嘗試過。
另一種方法(或更快)可能是創建計算列,該列包含.
之前和.
之後的部分並按它們排序。
第三種方法(如果您不能創建計算列)可能是在表中創建一個視圖,該表有兩個額外的列與字段的相應部分,然後在該視圖上進行選擇。
您可以通過根據期間('。')左側的內容計算一列來做到這一點。
但是,除非您能夠對字符串內容進行大量斷言,否則這種方法將非常難以在生產系統中使用。
另外處理字符串而不期間可能會導致一些悲傷
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
一個簡單的解決方案是將'5.xx'如'005.xx' – Andomar
啊,字母數字的排序:-) –
另一種解決方案的樂趣會將數字前綴和alpha後綴存儲在適當數據類型的單獨列中。 –