背景
自定义排序,意思是在表中的某个字段A,值有1,2,3。现想要按照自定义的序列来排序,如(2,1,3)的顺序排序。
解题思路:虚拟出一个不存在的排序字段sort,这个字段不需要存在表中,是通过一定的方式根据字段A的值实时计算出来,之后正常的按照sort字段排序即可。
使用field函数
介绍一下field函数
field(value, val1, val2, val3, ...)
其中value为字段,val1及后续字段为要搜索的值列表。
函数会返回每条记录中,value字段上的值在后续值列表中的索引位置,索引从1开始,找不到返回0,函数不区分大小写。
写法:
按照(2,1,3)排序
select * from table
order by field(A,2,1,3)
这个写法有个缺点,就是在表中如果只有1,2,3的值时能正常工作,而如果还有其他值如4,因为4未指定,field返回的是0,所以4会排在前面。
如果我们想要按照(2,1,3,其他)的顺序排列,通过这个办法其实也能实现,思考一下~
解题办法也很简单,就是倒序,只是sql上的写法看起来会有点奇怪(因为要反过来写)
select * from table
order by field(A,3,1,2) desc
通过将(2,1,3)倒序变成(3,1,2),然后增加desc倒序即可实现。
使用case when
case when其实就是if else,实现原理跟上面是一样的,只是如果自定义排序的值比较多的话,写的sql就比较长
写法:
select * from table
order by case A
when 2 then 1
when 1 then 2
when 3 then 3
else 4 end
相当于通过case when实现了一个自定义的field函数,2的时候排序值为1,1的时候排序值2,3的时候排序值3,其他值都为4。然后正序排即可。