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):将提取出的字符串转换成无符号整数,以便按数字进行排序。
排序结果如下:
热门推荐
西安交通大学第一附属医院副院长张谞丰:信息化建设是医院高质量发展的支柱
企业微信聊天记录迁移全攻略:无缝对接,高效办公
微信聊天记录迁移:便捷背后的安全隐患
微信聊天记录迁移全攻略:三种官方方法+跨品牌手机实测对比
太阳能电池板:环保新宠还是隐患?
双碳目标下,光伏产业如何引领绿色经济?
HJT异质结电池:光伏产业的下一个颠覆者
“你是真的狗”:一个网络流行语的演变之旅
“你是真的狗”:一个网络梗的爆笑起源与演变史
秋冬钓鱼攻略:掌握这些技巧,轻松成高手!
自然水域钓鱼攻略:如何找到鱼儿最爱的钓点?
海竿高手教你掌握钓鱼绝技!
秋季鲈鱼大赏:清蒸&红烧的美味秘籍
做什么生意风险比较小?十大低风险投资项目推荐
佛教修行智慧:你真的了解吗?
解决"电源已接通未充电"问题的全面指南与建议
《道德经》教你如何修心养生
修行智慧与现代人:从《心经》到正念冥想
跟着四普游宣城——走进敬亭山
哪些技能可以显著提升数据分析师的薪酬待遇?
中国航天创造新纪录:90分钟内连续成功发射两枚火箭
12生肖职场生存法则,如何避免被打压?
小学生家庭手机使用新规出炉!
张柏芝与谢霆锋离婚背后的故事与情感反思,值得深思的爱情历程
每天了解一个地区—西双版纳,中国热点旅游城市
世界十大顶级商务车盘点
鸣人的实力有质的提升是在什么时候
天宝农技:千禧番茄主根不下扎有好办法吗?
西红柿苗期怎么管理?抓好5个环节,为增产丰收打好基础
养老院动辄数万元预收费行不通了!监管新规实施后预收费要降、逐步实行按月收费