排序功能在系统中很常见,主要是对数字类型的字段进行升降排序。但是针对那些字符串数字或者带字符的数字字符串,普通的Sort排序就会出现各种各样的问题。比如对字符串数字进行降序排序,会出现:9,8,7,6,5,4,3,2,1,10,11这种异常情况。如何处理?请往下看。
单词语法
Sort
英 [sɔːt] 美 [sɔːrt]
n. 种类;类别;品种;某一种(或某一类)人;分类;排序
v. 整理;把…分类;妥善处理;安排妥当
复数 | sorts |
第三人称单数 | sorts |
现在分词 | sorting |
过去式 | sorted |
过去分词 | sorted |
经典例句
We sort out the rubbish. |
我们把垃圾进行分类。 |
编程语法
Java
需求:数据库有一张cabinet表,其中字段code的生成规则是字母加上自增的编号(CK2_9,CK2_10之类);目前要求通过code字段进行降序排序。
思路:如果直接用Spring的Sort.by方法或者是MySQL的order by 函数。都会出现下面这种情况。如何处理?我目前有三种解决方法,欢迎补充!!!
code |
CK2_9 |
CK2_8 |
CK2_7 |
CK2_12 |
CK2_11 |
CK2_10 |
第一种方法:直接利用MySQL自带的函数substring_index 对code字段进行字符串分隔。获取需要的数字部分,再通过+0的操作,将数字字符串转成纯数字。若数据量太大,则不推荐。
select * from cabinet order by (substring_index(code, '_', -1)+0) desc |
第二种方法:万金油方法,通过添加辅助字段解决排序问题。实在没有解决方案再用。
第三种方法:规范code数字部分的长度,补齐数字部分的长度,不足用0填充。比如将CK2_9和CK2_10 格式化成 CK2_009 和 CK2_010。然后就可以使用普通的排序方法。该方法需要提前预算数据量的大小,提前设置数字位的长度。
select code from cabinet order by code desc |
String.format("%04d", 1) |
以下是正常输出结果
code |
CK2_12 |
CK2_11 |
CK2_10 |
CK2_09 |
CK2_08 |
CK2_07 |
往期精彩
previous
英语| 123期 Schedule时刻表
英语| 122期 Space空格
英语| 121期 Memory内存
英语| 120期 Variable变量
英语| 119期 Parameter参数
英语| 118期 Index 索引
英语| 117期 Divide 分开