SQL实现自定义排序

业务事实上,经常会遇到排序问题,对数值类型字段排序不会有很大争议,但是有时希望对字符型字段按要求进行排序。本文记录自定义排序的几种方法。

使用case when关键字进行限定

本方法思路是将希望排序小的字符取值为较小的数字。注意end后面不要加as起别名。

sql 复制代码
select 
	*
from
	tableName
order by
case order_field when '超期0-5天' then 1
                 when '超期6-10天' then 2
                 when '超期11-15天' then 3
                 when '超期16-20天' then 4
                 when '超期21天及以上' then 5
end
field函数

field(str,str1,str2,...)函数可以返回str在str1,str2...列表中的位置,如果不存在返回结果0

sql 复制代码
select field('很好','很好','不好')  --结果:1
select field('不好','很好','不好')  --结果:2
select field('你好','很好','不好')  --结果:0
select field(null,'很好','不好')  --结果:0

str字符串可以替换为字段名,进而判断每个取值在列表中的排序,只要将列表按需求写好就可以实现自定义排序。

sql 复制代码
select 
	*
from
	tableName
order by field(order_field,'超期0-5天','超期6-10天','超期11-15天','超期16-20天','超期21天及以上')
字符串位置定位函数

这种方法的思路是,定位字符串在一个长串中的位置,返回的位置号是有大小的,长字符串按照要求写好就可以。

sql 复制代码
select locate('超期0-5天','超期0-5天,超期6-10天,超期11-15天,超期16-20天,超期21天及以上')  --返回结果:1
select locate('超期6-10天','超期0-5天,超期6-10天,超期11-15天,超期16-20天,超期21天及以上')  --返回结果:8
select instr('超期0-5天,超期6-10天,超期11-15天,超期16-20天,超期21天及以上','超期0-5天')  --返回结果:1
select instr('超期0-5天,超期6-10天,超期11-15天,超期16-20天,超期21天及以上','超期6-10天')  --返回结果:8

将字符串改为字段名

sql 复制代码
select 
	*
from
	tableName
order by locate(order_field,'超期0-5天,超期6-10天,超期11-15天,超期16-20天,超期21天及以上')
相关推荐
福建佰胜张工11 分钟前
深度解析 Allen-Bradley 150-B135NBDA 智能电机控制器:选型、参数与工业应用
运维·数据库·单片机·嵌入式硬件·安全·自动化
`Levie16 分钟前
MySQL-数据库服务日志管理与数据闪回
数据库·mysql
香蕉大香蕉(06敬畏市场)20 分钟前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
LaughingZhu35 分钟前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
standxy1 小时前
即时库存同步实战:从旺店通拉取库存详情落库 MySQL 的完整策略
数据库·集成·电商
麦壳饼1 小时前
SonnetDB:工业 IoT 中的 PID 历史分析与 PLC 协作
数据库·sonnetdb
吹什么轩1 小时前
MySQL 事务管理:从 ACID 到 MVCC,一篇讲透
数据库·mysql
时间售卖铺2 小时前
Oracle DQL精髓:从基础到高级实战
运维·数据库·云原生·oracle
m0_639906942 小时前
MySQL 锁机制详解|表锁、行锁、意向锁,死锁成因与解决方案
数据库·mysql
进击的荆棘2 小时前
MySQL——在ubuntu环境下安装MySQL
数据库·mysql·ubuntu