MySQL字符串排序实战:数字、百分比和文件名排序技巧
创作时间:
作者:
@小白创作中心
MySQL字符串排序实战:数字、百分比和文件名排序技巧
引用
CSDN
1.
https://blog.csdn.net/weixin_49114503/article/details/141053164
在实际项目中,我们可能会遇到数据库中用字符串类型存储了数字、百分比等数据。若直接用varchar进行排序可能并不是我们想要的效果,以下整理一下字符串如何按数字进行排序。
Mysql提供了两种类型转换函数,可以将字符串转换为执行类型(如数字类型)。相关内容参考Mysql convert函数、Mysql cast函数
示例数据:
CREATE TABLE `test` (
`id` int NOT NULL PRIMARY KEY AUTO_INCREMENT comment '主键id',
`number` varchar(10) DEFAULT NULL COMMENT '数字',
`percent` varchar(10) DEFAULT NULL COMMENT '百分比'
) ENGINE=InnoDB AUTO_INCREMENT=1;
insert into test(`number`, percent) values
('89.01','89.01%'),
('89.10','89.10%'),
('100.01','100.01%');
select * from test order by `number` desc;
可以发现数字最大的却排在最下面。
二、mysql字符串按数字排序
对上面的示例中的number字段进行排序
# 方法一:将number字段转换为float类型。 需mysql版本8.0.17及以上
select * from test order by cast(number as float) desc
select * from test order by convert(number, float) desc
# 方法二:将number字段转换为double类型。 需mysql版本8.0.17及以上
select * from test order by cast(number as double) desc
select * from test order by convert(number, double) desc
# 方法三:将number字段转换为decimal类型
select * from test order by cast(number as decimal(10,2)) desc
select * from test order by convert(number, decimal(10,2)) desc
排序结果如下:
若字段中全是整数无小数点,也可以使用下面的方式进行排序
# 将number字段转换为整数类型

select * from test order by cast(number as SIGNED) desc
select * from test order by convert(number, SIGNED) desc
三、mysql字符串百分比排序
对上面的示例中的percent字段进行排序
# 方法一:将number字段转换为decimal类型
-- 经测试后发现转换成decimal的时候默认会把%去掉,不受影响,若有影响可使用下面的方式,先把%去掉
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
在上面的sql中:
- REPLACE(percent, '%', '') :移除百分比字符串中的百分号。
- CAST(... AS DECIMAL(10,2)) :将结果转换为DECIMAL类型,其中10是总位数(包括小数点),2是小数位数。你可以根据需要调整这些值。
四、从字符串中提取数字并排序
1.如下,按文件名中的数字进行排序
让我们先看几个 file_name的示例值:
- 中文_1.mp4
- 中文_12.mp4
- 中文_2.mp4
- 中文_10.mp4
默认按file_name升序排序如下:
数据准备
CREATE TABLE `test1` (
`id` int NOT NULL PRIMARY KEY AUTO_INCREMENT comment '主键id',

`file_name` varchar(10) DEFAULT NULL COMMENT '文件名'
) ENGINE=InnoDB AUTO_INCREMENT=1;
insert into test1(file_name) values
('中文_1.txt'),
('中文_2.txt'),
('中文_10.txt'),
('中文_12.txt');
使用 REGEXP_SUBSTR 函数提取并排序
在MySQL 8.0及以上版本中,我们可以使用 REGEXP_SUBSTR() 函数来提取字符串中的数字部分。这个函数允许我们使用正则表达式来指定我们想要匹配的模式。在这个例子中,我们使用正则表达式 \d+ 来匹配一个或多个数字。
以下是完整的SQL查询,用于实现按数字排序:
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) :将提取出的字符串转换成无符号整数,以便按数字进行排序。
排序结果如下:
热门推荐
从线性城市到漂浮之城:全球10个在建未来城市大盘点
李开复谈“能得贵”现象:顶尖人才究竟值多少?
百年中山公园南门焕新:从“1.6万广场”到城市绿洲
全国多地赴中山取经,探索新型公共文化空间建设路径
量化投资迎科技革新,2024年收益率达14.32%
金融科技人才培养:宏观经济学不可或缺
核桃富含褪黑素助眠,这款芝麻红枣饼让你睡得香
中医专家王世龙:用“泽元安神汤”破解失眠难题
收心静坐、八段锦调理:道家养生改善冬季睡眠
陆林院士详解失眠:从成因分析到治疗方案
心率监测+数据分析:智能手表引领跑步训练新方式
水银体温计打碎了怎么办?
实验室水银泄漏应急处理指南:最新版出炉!
苏州吴中区水银泄漏事件:官方紧急响应,居民楼已解封
水银泄漏后,你还在盲目拖地吗?
朱砂清洗的正确方法
饭后最佳姿势大揭秘:散步最有益,但需掌握时机
饭后站立15分钟,科学助力消化吸收
饭后别急着躺下!专家解析三种姿势对消化的影响
饭后散步好处多,但并非人人适宜,专家提醒这些细节
多地竞相布局飞行汽车项目,市场规模突破220亿美元
从通勤到救援:飞行汽车重塑城市交通格局
小鹏、广汽等布局飞行汽车,中国抢占未来出行新赛道
皮肤瘙痒红肿的四大原因与应对方法
看小便知健康:身体缺水的两个判断标准
深圳南山小学四年级数学试卷引热议,专家称符合现代教育趋势
红岭实验小学:80%课程实现跨学科融合,重塑学生学习方式
《国色芳华》妆造被指抄袭,作者宽容回应引发版权讨论
《国色芳华》:以反套路剧情和精良制作展现盛唐文化魅力
中工农建交入选全球系统重要性银行,金融科技人才需求激增