2013-05-13 27 views
43

我試圖按數據庫中的數字列進行排序,其值爲1-999用於按數字排序的SQL - 1,2,3,4等而不是1,10,11,12

當我用

ORDER_BY registration_no ASC 

我得到...。

1 
101 
102 
103 
104 
105 
106 
107 
108 
109 
11 
110 
Etc… 

所以它似乎是排序的第一位數字反對的數字。

有沒有人知道如果我想按價值排序這是什麼SQL?所以1,2,3,4,5,6

+10

你列是VARCHAR類型的,因爲其中的你面對此行爲。 – Meherzad 2013-05-13 10:19:26

+0

registration_no列的數據類型是什麼? – 2013-05-13 10:19:41

+4

使用'order by registration_no + 0 asc'來解決您的問題。 – Meherzad 2013-05-13 10:20:32

回答

35
ORDER_BY cast(registration_no as unsigned) ASC 

明確將值轉換爲數字。達到相同的另一種可能性是

ORDER_BY registration_no + 0 ASC 

這將迫使一個隱含的對話。

其實你應該檢查表格定義並改變它。您可以將數據類型更改爲int這樣

ALTER TABLE your_table MODIFY COLUMN registration_no int; 
2

我假設你的列類型是STRING(CHAR,VARCHAR等)和排序過程的排序它作爲一個字符串。你需要做的是將值轉換爲數值。如何做到這一點將取決於你使用的SQL系統。由正整數,當它們被存儲爲varchar訂購

66

的一種方法,是由長度第一和然後將該值訂購:

order by len(registration_no), registration_no 

這是當列可能包含非數字是特別有用值。

注意:在某些數據庫中,獲取字符串長度的函數可能被稱爲length()而不是len()

+1

哇。用語言表達我的敬畏 – Lordbalmon 2017-05-10 02:31:58

+0

這在所有情況下都不起作用。在頭頂上,不起作用的情況是整數的混合;負數,帶前導零的數字,帶分數的數字以及組合的字數。 – 2017-06-14 14:41:19

+7

@ Knickerless-Noggins。 。 。閱讀答案的第一句話。我認爲這很清楚。 – 2017-06-14 16:06:41

8

如果您正在使用SQL Server:

ORDER_BY cast(registration_no as int) ASC 
+0

非常好,thx :) – Zombyii 2017-10-16 14:52:13

1

我寧願做一個 「PAD」 的數據。 MySql將其稱爲LPAD,但您可以在SQL Server中按照自己的方式做同樣的事情。

ORDER BY REPLACE(STR(COLNAME,3),空間(1), '0')

此公式將提供主要基於的3列的長度的零此功能是在其它情況下是非常有用的ORDER BY之外,所以這就是爲什麼我想提供這個選項。

結果:1變成001,10變成010,而100保持不變。

0

有時你只是沒有選擇存儲混合文本的數字。在我們的一個應用程序中,我們用於電子商務網站的網站主機使得過濾器動態地脫離列表。除了顯示的文本之外,沒有任何選項可以按任何字段排序。當我們想要過濾器建立一個列表,說如 2「至8」 9「至12」 13「至15」等,我們需要它來排序2-9-13,而不是13-2-9作爲它會在讀取數字值時。所以我使用了SQL Server Replicate函數以及最長數字的長度來填充任何較短的數字和前導空格。現在20在3之後排序,依此類推。

我正在處理一個視圖,該視圖爲我提供了項目類型和類的最小和最大長度,寬度等,這裏是我如何完成文本的一個示例。 (LB Ñ低和LB Ñ高是低和5個長度括號的高端。)

REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text, 
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text, 
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text, 
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text, 
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text 
相關問題