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):将提取出的字符串转换成无符号整数,以便按数字进行排序。
排序结果如下:
热门推荐
舒尔特方格:真的能训练专注力吗?
打工人午休,流行去新中式推拿店“回血”
检查一下,家里有这5种“内衣”的赶紧扔掉!为了身体别大意
怎样分析股票的财务报表?财务报表对股票价值的判断有何依据?
哪吒2大爆,但也别被民族主义冲昏了头
宝可梦朱紫月亮伊布怎么进化
冰箱保鲜温度的最佳设定(确定冰箱保鲜温度的标准及建议)
失业金一般领几个月?广州失业人员领取失业金期限怎么计算?
丹参栽培技术,水肥管理要上心,科学种植很关键
高考选大学选专业的12大真相,现在知道还不晚
智能家居通信:有线、无线及PLC技术全解析
探索命题规律 发挥价值引领——记合肥一中教育集团第三十八期数学校本教研周
提升个人信用的重要性与方法解析
我国铁路拆迁农村房屋补偿方式及标准详解
浅谈事业单位绩效工资改革存在的问题及改进建议
多少分可以稳上岸?人大新传考研分数线深度解析
二战大杀器之零式战斗机,从横行亚太到走向灭亡
云南五日游穿衣建议及路线攻略
重庆合川区花果小学:创新引入地面游戏,推动体育教学改革
湛江一初中生被曝遭多名同学殴打!拖把打头、嘴里塞异物?
成华区崔家店板块成房企争夺焦点,华润置地再次押注
鞠婧祎:以梦为马,不负韶华的多栖才女
开封旅游攻略:3天2晚深度游,2天1晚特种兵玩法,清明上河园最强游玩时间表
手机如果收到“这种短信”,请马上关机!已有多人被盗刷银行卡
如何选择适合自己的洁面?一篇讲透皂基VS氨基酸洁面!
详解新西兰绿卡最快通道——绿名单移民(附职业清单)
一口豆腐,一年“都富”!春节吃“豆”,如何做到美味营养不重样?
鼻窦炎鼻甲肥大需要手术吗?一文详解治疗方案
新疆大学王牌专业 最好的专业是什么
实时语音克隆技术:5秒内复制声音的革命性突破