mysql中字段類型轉換排序

表中字段server_id是varchar類型,現在我們查詢數據時想以server_id排一下序,排序後的結果:

select server_id from cardserver where game_id = 1 order by server_id desc limit 10;
+———–+
| server_id |
+———–+
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 10        |
| 1         |
+———–+
很明顯,我們想要的結果應該是 10,8,7,6,5 這樣的。但是這個10排在瞭2的後面。按照字符串來排的。其實我們是想把它當做數值來排。

手動轉換類型:

用下面的方法就可以瞭,使server_id+0之後再排序,問題解決瞭。

select server_id from cardserver where game_id = 1 order by server_id+0 desc limit 10;
+———–+
| server_id |
+———–+
| 10        |
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 1         |
+———–+
使用MySQL函數CAST/CONVERT:

mysql為我們提供瞭兩個類型轉換函數:CAST和CONVERT,現成的東西我們怎能放過?

CAST() 和CONVERT() 函數可用來獲取一個類型的值,並產生另一個類型的值。
這個類型 可以是以下值其中的 一個:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

所以我們也可以用CAST解決問題:

select server_id from cardserver where game_id = 1 order by CAST(server_id as SIGNED) desc limit 10;
+———–+
| server_id |
+———–+
| 10        |
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 1         |
+———–+
也可以使用CONVERT來搞定此問題:

select server_id from cardserver where game_id = 1 order by CONVERT(server_id,SIGNED) desc limit 10;
+———–+
| server_id |
+———–+
| 10        |
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 1         |
+———–+
總結:

條條大道通羅馬,條條小路通我傢。不管是啥方法,解決問題就是好方法。當然,既然MySQL為我們提供瞭現成的函數。我們為何不讓代碼顯得更漂亮些呢?呵呵。

所以MySql varchar排序推薦使用CAST或CONVERT函數。

You May Also Like