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天及以上')
相关推荐
白帽攻防录3 小时前
SRC 挖洞:Roundcube 预认证 SQL 注入深度复盘,CVE-2026-48842 preg_replace 转义绕过怎么打穿邮件系统
网络·数据库·sql·网络安全·sql注入
꯭自꯭闭꯭3 小时前
达梦SQL优化相关
linux·运维·数据库·sql
对空六课4 小时前
支持注意力分析的热力图工具有哪些?
前端·数据库·数据分析
南京码讯光电技术有限公司4 小时前
How to Design an Antenna System for an Industrial WiFi Module
数据库·人工智能
lusklusklusk5 小时前
Oracle数据库基础之2_体系结构
数据库·oracle
可乐ea5 小时前
从第一性原理构建 AI Agent:提示词、工具、技能与记忆全解剖
数据库·人工智能·工具调用·ai智能体·提示词工程·agent开发·智能体记忆
东方护航数据恢复(深圳)6 小时前
医疗案例:HIS/PACS 数据库页损坏修复,医院不停诊完成恢复【东方护航数据恢复深圳店】
数据库·数据恢复·医疗·二次开盘
lusklusklusk7 小时前
Oracle数据库基础之11_Duplicate和Dataguard和RAC
数据库·oracle
PHP实战开发录8 小时前
MySQL字段加索引为什么没变快
数据库·mysql·php·开发
红红谈说9 小时前
标签化推送与已读统计怎么做?一次通知链路的工程复盘
数据库·消息推送·数字乡村·集合运算·已读回执·标签体系·写入放大