MySQL字符串按照數(shù)值排序方式
MySQL字符串按照數(shù)值排序
1.需求
MySQL 有個表字段設(shè)計(jì)的時候,設(shè)置為了 varchar 類型,存取的卻是數(shù)值,后續(xù)有業(yè)務(wù)需要按照此字段排序,獲取最大值。
按照最原始的排序語句為:
SELECT * FROM test_21 a ORDER BY a.testId desc;
結(jié)果為:

這個并不是想要的結(jié)果。
2.方法
改造一下
1)與 int 進(jìn)行計(jì)算
SELECT * FROM test_21 a ORDER BY a.testId+0 desc; SELECT * FROM test_21 a ORDER BY a.testId-2 desc; SELECT * FROM test_21 a ORDER BY a.testId*1 desc; SELECT * FROM test_21 a ORDER BY a.testId/4 desc;
MySQL 的 varchar 與 int 計(jì)算時,會轉(zhuǎn)換為 int。
以上4個 sql 的執(zhí)行結(jié)果都為

2)cast() 或 convert()
SELECT * FROM test_21 a ORDER BY cast(a.testId as SIGNED) desc; SELECT * FROM test_21 a ORDER BY convert(a.testId,SIGNED) desc;
這兩個函數(shù)都是用于格式轉(zhuǎn)換的,二者沒什么區(qū)別,
語法為:
CAST(expr AS type) CONVERT(expr,type)
支持的類型有
| 值 | 說明 |
|---|---|
| DATE | 將expr轉(zhuǎn)換成’YYYY-MM-DD’格式 |
| DATETIME | 將expr轉(zhuǎn)換成’YYYY-MM-DD HH:MM:SS’格式 |
| TIME | 將expr轉(zhuǎn)換成’HH:MM:SS’格式 |
| CHAR | 將expr轉(zhuǎn)換成CHAR(固定長度的字符串)格式 |
| SIGNED | 將expr轉(zhuǎn)換成INT(有符號的整數(shù))格式 |
| UNSIGNED | 將expr轉(zhuǎn)換成INT(無符號的整數(shù))格式 |
| DECIMAL | 將expr轉(zhuǎn)換成FLOAT(浮點(diǎn)數(shù))格式 |
| BINARY | 將expr轉(zhuǎn)換成二進(jìn)制格式 |
結(jié)果都為:

MySQL按字符串?dāng)?shù)字排序處理
公司不知是誰設(shè)計(jì)的表菜單排序字段竟然設(shè)置成了字符串。
CREATE TABLE `s_menu` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `PARENT_ID` int(11) DEFAULT NULL, `ORDER` varchar(5) DEFAULT NULL, `MENU_NAME` varchar(255) DEFAULT NULL, `MENU_URL` varchar(255) DEFAULT NULL, `MENU_ICON` varchar(100) DEFAULT NULL, `SORT_NUM` int(2) DEFAULT NULL, `IS_SHOW` int(2) DEFAULT NULL, `PERMISSION` varchar(100) DEFAULT NULL, `LOGIN_TYPE` int(11) DEFAULT NULL COMMENT '0:WEB,1:PC,2:APP', `CREATE_BY` int(11) DEFAULT NULL, `CREATE_DATE` date DEFAULT NULL, `MEMO` varchar(1000) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=254 DEFAULT CHARSET=utf8 COMMENT='菜單';
為了減少代碼的改動量
SELECT
`ID`,
`PARENT_ID` ,
`ORDER` ,
`MENU_NAME`,
`MENU_URL` ,
`MENU_ICON` ,
`SORT_NUM` ,
`IS_SHOW` ,
`PERMISSION` ,
`LOGIN_TYPE` ,
`CREATE_BY` ,
`CREATE_DATE`,
`MEMO`
FROM
s_menu
ORDER BY
(s_menu.ORDER+0) ASC將字符的數(shù)字轉(zhuǎn)成數(shù)字,比如"123"轉(zhuǎn)成123可以直接用字符數(shù)字+0來實(shí)現(xiàn)
也可以使用 cast(str as SIGNED)
SELECT
`ID`,
`PARENT_ID` ,
`ORDER` ,
`MENU_NAME`,
`MENU_URL` ,
`MENU_ICON` ,
`SORT_NUM` ,
`IS_SHOW` ,
`PERMISSION` ,
`LOGIN_TYPE` ,
`CREATE_BY` ,
`CREATE_DATE`,
`MEMO`
FROM
s_menu
ORDER BY
cast (s_menu.ORDER as SIGNED) ASC總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Ubuntu下取消MySQL數(shù)據(jù)庫本機(jī)綁定限制方法
在Ubuntu系統(tǒng)中,添加了MySQL賬戶,賦予了數(shù)據(jù)庫完全操作權(quán)限,并且允許數(shù)據(jù)庫從外部鏈接 但是,還是無法遠(yuǎn)程訪問MySQL數(shù)據(jù)庫2013-06-06
Mapper sql語句字段和實(shí)體類屬性名字有什么關(guān)系
這篇文章主要介紹了Mapper sql語句字段和實(shí)體類屬性名字有什么關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
mysql數(shù)據(jù)庫遷移至Oracle數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了mysql數(shù)據(jù)庫遷移至Oracle數(shù)據(jù)庫的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
MySQL對JSON類型字段數(shù)據(jù)進(jìn)行提取和查詢的實(shí)現(xiàn)
本文主要介紹了MySQL對JSON類型字段數(shù)據(jù)進(jìn)行提取和查詢的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
MYSQL 高級文本查詢之regexp_like和REGEXP詳解
在MySQL中,regexp_like和REGEXP都是用于執(zhí)行正則表達(dá)式搜索的函數(shù),這篇文章主要介紹了MYSQL 高級文本查詢之regexp_like和REGEXP,需要的朋友可以參考下2023-05-05

