我試圖按數據庫中的數字列進行排序,其值爲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
等
我試圖按數據庫中的數字列進行排序,其值爲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
等
ORDER_BY cast(registration_no as unsigned) ASC
明確將值轉換爲數字。達到相同的另一種可能性是
ORDER_BY registration_no + 0 ASC
這將迫使一個隱含的對話。
其實你應該檢查表格定義並改變它。您可以將數據類型更改爲int
這樣
ALTER TABLE your_table MODIFY COLUMN registration_no int;
我假設你的列類型是STRING(CHAR,VARCHAR等)和排序過程的排序它作爲一個字符串。你需要做的是將值轉換爲數值。如何做到這一點將取決於你使用的SQL系統。由正整數,當它們被存儲爲varchar
訂購
的一種方法,是由長度第一和然後將該值訂購:
order by len(registration_no), registration_no
這是當列可能包含非數字是特別有用值。
注意:在某些數據庫中,獲取字符串長度的函數可能被稱爲length()
而不是len()
。
哇。用語言表達我的敬畏 – Lordbalmon 2017-05-10 02:31:58
這在所有情況下都不起作用。在頭頂上,不起作用的情況是整數的混合;負數,帶前導零的數字,帶分數的數字以及組合的字數。 – 2017-06-14 14:41:19
@ Knickerless-Noggins。 。 。閱讀答案的第一句話。我認爲這很清楚。 – 2017-06-14 16:06:41
如果您正在使用SQL Server:
ORDER_BY cast(registration_no as int) ASC
非常好,thx :) – Zombyii 2017-10-16 14:52:13
我寧願做一個 「PAD」 的數據。 MySql將其稱爲LPAD,但您可以在SQL Server中按照自己的方式做同樣的事情。
ORDER BY REPLACE(STR(COLNAME,3),空間(1), '0')
此公式將提供主要基於的3列的長度的零此功能是在其它情況下是非常有用的ORDER BY之外,所以這就是爲什麼我想提供這個選項。
結果:1變成001,10變成010,而100保持不變。
有時你只是沒有選擇存儲混合文本的數字。在我們的一個應用程序中,我們用於電子商務網站的網站主機使得過濾器動態地脫離列表。除了顯示的文本之外,沒有任何選項可以按任何字段排序。當我們想要過濾器建立一個列表,說如 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
你列是VARCHAR類型的,因爲其中的你面對此行爲。 – Meherzad 2013-05-13 10:19:26
registration_no列的數據類型是什麼? – 2013-05-13 10:19:41
使用'order by registration_no + 0 asc'來解決您的問題。 – Meherzad 2013-05-13 10:20:32