2013-05-17 37 views
6

對不起我的錯,我應該爲這個問題真正的樣品,我的ID裏面包含的字符:爲了通過1.99.10和1.99.9的SQL Server

示例代碼:

select ID from student order by ID 

Expected output from mine   but system output 
-------------------------   ----------------- 
JAD.1.99.9        JAD.1.99.10 
JAD.1.99.10       JAD.1.99.9 

和這IDnvarchar類型。

+2

當按文本值排序時,系統輸出是正常的預期行爲。他們不是數字。字符「1」在字符「9」之前。 – Tim

+0

按照此鏈接可能會得到一些想法..http://stackoverflow.com/questions/119730/how-do-i-sort-a-varchar-column-in-sql-server-that-c​​ontains-numbers – Pank

+0

可能的重複[如何對'版本號'列一般使用SQL Server查詢]進行排序(http://stackoverflow.com/questions/3474870/how-can-i-sort-a-version-number-column -Generically-using-a-sql-server-query) – Pondlife

回答

14

Yesterday有一個類似的問題在那裏我瞭解到,您可以使用hierarchyid進行版本排序(如果您使用至少SQL-Server 2008中):

SELECT id 
FROM student 
ORDER BY Cast('/' + Replace(id, '.', '/') + '/' AS HIERARCHYID) 

DEMO

+0

正確的解決方案! –

+2

這是一個漂亮的技巧! –

+0

感謝您指出我的錯誤...在我的答案..... –

-2

您需要訂購由任何點之後的部分的子串組成。這將是一個數據庫特定的SQL查詢,因爲你沒有提到你正在使用哪一個,所以我不能給出詳細的SQL示例。

這是你可以投出小數值

http://www.w3resource.com/sql/aggregate-functions/avg-decimal-places-using-cast-within-avg.php

蒂姆答案是最好的..

但我給訂單VARCHAR值多了一個解決方案 -

SELECT id 
FROM student 
ORDER BY ID desc 
+2

這將不會返回user2098512想要的值 –

+0

您不能僅僅因爲OP的結果命令錯誤就改變順序。現在,即使id爲1.99.8和1.99.9,排序也總是降序排列。這也不是版本排序。只需用'2.1.1'和'2.1'來測試它,它以'2.1'開頭。 –

+2

此查詢非常適合在varchar類型中排序....列 – Pank