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天及以上')
相关推荐
摇滚侠10 分钟前
全面掌握PostgreSQL关系型数据库,设置远程连接,笔记05,笔记06
java·数据库·笔记·postgresql
mpHH12 分钟前
postgresql plancache --doing
数据库·学习·postgresql·1024程序员节
布朗克16815 分钟前
MySQL 运算符详细说明
数据库·mysql·运算符·1024程序员节
机灵猫44 分钟前
微服务中的服务熔断、降级与限流
java·数据库·微服务
枫叶丹41 小时前
破局政务数字化核心难题:金仓数据库以国产化方案引领电子证照系统升级之路
数据库·政务·1024程序员节·金仓
托比-马奎尔1 小时前
Redis主从集群
数据库·redis·缓存
码力引擎2 小时前
【零基础学MySQL】第一章:MySQL介绍与安装
数据库·mysql·1024程序员节
235162 小时前
【MySQL】慢查寻的发现和解决优化(思维导图版)
java·后端·sql·mysql·职场和发展·数据库开发·数据库架构
小超嵌入式笔记2 小时前
【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】
java·数据库·mongodb
hweiyu003 小时前
Node.js+Koa2+MySQL 打造前后端分离项目(视频教程)
数据库·mysql·node.js