MySQL字符串按照數(shù)值排序方式
MySQL字符串按照數(shù)值排序
1.需求
MySQL 有個(gè)表字段設(shè)計(jì)的時(shí)候,設(shè)置為了 varchar 類型,存取的卻是數(shù)值,后續(xù)有業(yè)務(wù)需要按照此字段排序,獲取最大值。
按照最原始的排序語(yǔ)句為:
SELECT * FROM test_21 a ORDER BY a.testId desc;
結(jié)果為:
這個(gè)并不是想要的結(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ì)算時(shí),會(huì)轉(zhuǎn)換為 int。
以上4個(gè) 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;
這兩個(gè)函數(shù)都是用于格式轉(zhuǎn)換的,二者沒(méi)什么區(qū)別,
語(yǔ)法為:
CAST(expr AS type) CONVERT(expr,type)
支持的類型有
值 | 說(shuō)明 |
---|---|
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(固定長(zhǎng)度的字符串)格式 |
SIGNED | 將expr轉(zhuǎn)換成INT(有符號(hào)的整數(shù))格式 |
UNSIGNED | 將expr轉(zhuǎn)換成INT(無(wú)符號(hào)的整數(shù))格式 |
DECIMAL | 將expr轉(zhuǎn)換成FLOAT(浮點(diǎn)數(shù))格式 |
BINARY | 將expr轉(zhuǎn)換成二進(jìn)制格式 |
結(jié)果都為:
MySQL按字符串?dāng)?shù)字排序處理
公司不知是誰(shuí)設(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='菜單';
為了減少代碼的改動(dòng)量
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來(lái)實(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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入淺析MySQL 中 Identifier Case Sensitivity問(wèn)題
這篇文章主要介紹了MySQL 中 Identifier Case Sensitivity,需要的朋友可以參考下2018-09-09MySQL 表數(shù)據(jù)的導(dǎo)入導(dǎo)出操作示例
這篇文章主要介紹了MySQL 表數(shù)據(jù)的導(dǎo)入導(dǎo)出操作,結(jié)合實(shí)例形式分析了MySQL 表數(shù)據(jù)的導(dǎo)入導(dǎo)出操作基本命令、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04dbeaver如何導(dǎo)出mysql數(shù)據(jù)庫(kù)
DBeaver導(dǎo)出MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)便方法:右鍵點(diǎn)擊表選擇“Tools”->“Dump database”,設(shè)定輸出文件夾(例如桌面),點(diǎn)擊開(kāi)始即可導(dǎo)出SQL文件,此方法基于個(gè)人經(jīng)驗(yàn),供參考2024-10-10SQL中row_number()?over(partition?by)的用法說(shuō)明
這篇文章主要介紹了SQL中row_number()?over(partition?by)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07