MySQL字符串排序实战:数字、百分比和文件名排序技巧
创作时间:
作者:
@小白创作中心
MySQL字符串排序实战:数字、百分比和文件名排序技巧
引用
CSDN
1.
https://blog.csdn.net/weixin_49114503/article/details/141053164
在数据库开发中,我们经常会遇到字符串类型存储了数字、百分比等数据的情况。如果直接使用varchar进行排序,往往无法得到预期的结果。本文将介绍如何在MySQL中对字符串进行数字排序、百分比排序以及从字符串中提取数字排序。
一、MySQL字符串按数字排序
假设我们有一张表test
,其中number
字段存储了数字字符串:
CREATE TABLE `test` (
`id` int NOT NULL PRIMARY KEY AUTO_INCREMENT comment '主键id',
`number` varchar(10) DEFAULT NULL COMMENT '数字'
);
insert into test(`number`) values
('89.01'),
('89.10'),
('100.01');
如果我们直接按照number
字段进行排序:
select * from test order by `number` desc;
结果可能不符合预期:
这是因为字符串排序是按照字符的ASCII码进行的。为了解决这个问题,我们可以使用CAST
或CONVERT
函数将字符串转换为数字类型:
方法一:转换为浮点数
select * from test order by cast(number as float) desc;
select * from test order by convert(number, float) desc;
方法二:转换为双精度数
select * from test order by cast(number as double) desc;
select * from test order by convert(number, double) desc;
方法三:转换为十进制数
select * from test order by cast(number as decimal(10,2)) desc;
select * from test order by convert(number, decimal(10,2)) desc;
如果字段中全是整数无小数点,也可以使用下面的方式进行排序:
select * from test order by cast(number as SIGNED) desc;
select * from test order by convert(number, SIGNED) desc;
二、MySQL字符串百分比排序
假设我们有一张表test
,其中percent
字段存储了百分比字符串:
CREATE TABLE `test` (
`id` int NOT NULL PRIMARY KEY AUTO_INCREMENT comment '主键id',
`percent` varchar(10) DEFAULT NULL COMMENT '百分比'
);
insert into test(percent) values
('89.01%'),
('89.10%'),
('100.01%');
我们可以使用以下方法进行排序:
方法一:直接转换为十进制数
select * from test order by cast(percent as decimal(10,2)) desc;
select * from test order by convert(percent , decimal(10,2)) desc;
方法二:先移除百分号再转换
select * from test order by cast(REPLACE(percent, '%', '') as decimal(10,2)) desc;
select * from test order by convert(REPLACE(percent, '%', '') , decimal(10,2)) desc;
三、从字符串中提取数字并排序
假设我们有一张表test1
,其中file_name
字段存储了文件名:
CREATE TABLE `test1` (
`id` int NOT NULL PRIMARY KEY AUTO_INCREMENT comment '主键id',
`file_name` varchar(10) DEFAULT NULL COMMENT '文件名'
);
insert into test1(file_name) values
('中文_1.txt'),
('中文_2.txt'),
('中文_10.txt'),
('中文_12.txt');
我们可以使用REGEXP_SUBSTR
函数提取数字部分并排序:
SELECT *
FROM test1
WHERE file_name LIKE '%中文%'
ORDER BY CAST(REGEXP_SUBSTR(file_name , '\\d+') AS UNSIGNED);
这条SQL语句做了以下几件事:
WHERE original_name LIKE '%中文%'
:筛选出所有文件名包含“中文”的记录。REGEXP_SUBSTR(original_name, '\\d+')
:从 original_name 中提取第一组连续的数字。CAST(... AS UNSIGNED)
:将提取出的字符串转换成无符号整数,以便按数字进行排序。
排序结果如下:
热门推荐
成为港股通的条件有哪些?如何判断自己是否满足这些条件?
吃了阿莫西林之后多久能吃布洛芬
检索增强生成(RAG)技术与应用的全景图
青岛打造不动产登记“一零零”满分服务体系,有这些便民举措→
秦非子秦嬴是如何成为秦国君主的?他有哪些成就?
PPT实用技巧:如何在不解散组合的情况下添加新证书
电动四驱系统越野可靠性解析,重点分析非机械耦合系统能否实现四轮同步输出
农村宅基地确权:作用、查询方法与具体内容全解析
中国古代十大“封号”名将再排名:史上十大战将
元神有哪些?从道教、佛教到儒家的多元解读
如何验证职业技能鉴定证书的真实性?
历史上伟大的黑人:他们的光芒与贡献
电磁传感器:工作原理、应用与选型指南
广东人口格局变迁:广深佛人口再创新高!
手把手教你制作渐变色竹编扇
河南漯河:加力促进健康食品从研到产
弘扬航空报国精神,培养飞行器总体设计总师级人才——走近南京航空航天大学航空学院
2025年上半年教师资格证笔试报名信息汇总
甘精胰岛素用量
PCB常见问题解答:为什么多层PCB大多选择偶数层数?
冠状动脉痉挛用什么药治疗
冠状动脉痉挛
卡内基梅隆大学研究生学费详解:各学院专业费用一览
伤官生财格成格条件
假想防卫与正当防卫的区别及特征分析
假想防卫和偶然防卫的区分是什么?假想防卫的特征有哪些?
巴黎奥运会闭幕 中国代表团获40金 创境外参赛历史最好成绩
药师说药丨药物左右手疗效大不同
药师说药丨药物左右手疗效大不同
火源与可燃物的防范与控制