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):将提取出的字符串转换成无符号整数,以便按数字进行排序。
排序结果如下:
热门推荐
目标之路实现理想
欠钱不还起诉需要多久?费用如何计算?
韩城市教体系统多维度传承雷锋精神 打造德育实践新范式
柯南重要案件:穿越危机的侦探故事
人际关系的发展趋势会受到哪些因素影响?
最新CPI发布啦,到底高好还是低好?
3D打印耗材哑光PLA详解
销售数据分析在销售决策中的作用与重要性
事业单位经费形式:全额拨款、差额拨款和自收自支的区别
中药中风醒脑液登上《柳叶刀》之后
大盘趋势的变化如何把握投资机会?这种投资机会的风险如何评估?
红枣生长周期及栽培技巧(从种植到收成,了解红枣生长周期的每一个环节)
一篇读懂PDCA模型的内容与应用!
善假于物也:《劝学》中的特殊句式及其深层含义
君子生非异也,善假于物也。
二甲双胍的心血管保护:新版糖尿病指南发布之后的新视角
什么是荷荷巴油
鹿野苑石刻博物馆:一座融合自然与人文的建筑艺术精品
越野爱好者品位变了?中国越野车排名:普拉多第10,豹5排进前三
有“钱途”的美国研究生专业有哪些?
营销流程建设的秘密:从目标设定到数据分析
为数据分析选择合适的数据模型
打开心门,共筑和谐——《解码中国式家庭教育》引领亲子沟通新篇章
灰尘大的楼层如何选择与防护
云南咖啡百年醇香 多元“咖味”助“咖位”提升
中国人怎么在加拿大开中医馆
大小球初盘看盘技巧:基于多维特征空间与动态贝叶斯优化的量化分析模型
莫兰特合同薪水金额的法律分析与探讨
什么是AI架构师 怎么成为一个AI架构师
深度学习在推荐系统中的应用:从理论到实践