mysql字符串按数字排序,mysql字符串百分比排序

发布时间:2025-06-24 16:41:50  作者:北方职教升学中心  阅读量:729


文章目录。

  • 一、前言。
  • 二、mysql字符串按数字排序。
  • 三、mysql字符串百分比排序。
  • 四、从字符串中提取数字并排序。

一、前言。

在实际项目中,数字、百分比等数据存储在数据库中可能会遇到。如果直接用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字段进行排序。

# 方法1:将number字段转换为float类型。 8.00mysql版本需要mysql版本.17及以上。select。*。from。test。 order。by。cast。(。number。 as。float。)。desc。select。*。from。test。 order。by。convert。(。number。,float。)。desc。# 方法二:将number字段转换为double类型。 8.00mysql版本需要mysql版本.17及以上。select。*。from。test。 order。by。cast。(。number。 as。double。)。desc。select。*。from。test。 order。by。convert。(。number。,double。)。desc。# 方法3:将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字段进行排序。

# 方法1:将number字段转换为decimal类型。-- 测试后发现转换为decimal时,默认会去除%󿀌#xfff00不受影响c;如有影响,可使用以下方法,先把%去掉。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.总位数(包括小数点),二是小数位数。这些值可以根据需要进行调整。

四、从字符串中提取数字并排序。

1.以下是�根据文件名中的数字进行排序。

让我们先看几个 file_name示例值:

  • 中文_1.mp4。
  • 中文_12.mp4。
  • 中文_2.mp4。
  • 中文_10.mp4。

按照file_name的默认排序如下a;
在这里插入图片描述

数据准备。

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)。:将提取的字符串转换为无符号整数,按数字排序。

排序结果如下::
在这里插入图片描述