码迷,mamicode.com
首页 > 数据库 > 详细

【SQL】按照特定所需的元素排序

时间:2017-07-13 20:32:04      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:decode   where   排列   select   想法   函数实现   code   语句   name   

Oracle中,平时我们排序常用“Order by 列名” 的方式来排序,但是有的时候我们希望这个列中的某些元素排在前面或者后面或者中间的某个位置。

这时我们可以使用Order by case when then方法。

举例:我们希望本部门的领导的名字在前面。

Select * from parter where lvl=leader order by ( case when name in(zhangsan,lisi,wangermazi) then 0 else 1 end)

实现的效果是:‘zhangsan‘,‘lisi‘,‘wangermazi‘  从头到尾依次排序,剩下的元素排在这三个元素的后面随机排序。把1和0替换,又变成了‘wangermazi’,‘lisi‘,‘zhangsan‘的顺序倒序排序了。

0是我们需要的元素的位置,1是其他元素的位置。

同样的效果我们也可以通过“decode”函数实现

Select * from parter where lvl = leader order by decode(name,zhangsan,0,lisi,1,wangermazi,2,3)

实现的效果与上面相同,其中0,1,2是我们需要的三个元素的位置,3是其他元素的位置。

但是第一个SQL语句有一个问题,如果name字段就只有这三个元素,那么when 完全满足条件,这样这三个元素就变成随机排序了。

所以如果使用case 函数,最好是使用这种方式

Select * from parter where lvl=leader order by (case when name=zhangsan then 0 when name=lisi then 1 name=wangermazi then 2 else 3 end)

 

如此,即便name字段只有三个元素,也能按照我们的需求排序了。

需要注意的是,只有我们需要的三个元素是按照我们的所定义的顺序排序的,其余元素是随机排序的,如果我们需要其余元素按照某个字段顺序或者倒序排序,只需要在最后面加逗号字段名即可。

Select * from parter where lvl=leader order by (case when name=zhangsan then 0 when name=lisi then 1 name=wangermazi then 2 else 3 end),id desc

decode函数相同

Select * from parter where lvl = leader order by decode(name,zhangsan,0,lisi,1,wangermazi,2,3),id desc

 

 

由上面的例子我们知道,那些数字就是元素的位置,而如果我们要把自己需要的元素排最后面呢。

只需要改改数字就行了。

case 函数

Select * from parter where lvl=leader order by (case when name=zhangsan then 3 when name=lisi then 2 name=wangermazi then 1 else 0 end).id desc

decode函数相同

Select * from parter where lvl = leader order by decode(name,zhangsan,3,lisi,2,wangermazi,1,0),id desc

 

 而强大的decode函数还为我们可以将余下的元素按照自己的想法排序。

假如我们要把‘zhangsan‘和‘lisi‘排最后,而把‘wangermazi‘排第一,这时我们可以同时使用两个decode函数

Select * from parter where lvl = leader order by decode(name,zhangsan,3,lisi,2,0),decode(name,wangermazi,1),id desc

如此我们便实现了张三和李四分别排倒数第一和倒数第二,王二麻子排第一,其余元素按照id倒序排列。

 

如此我们便实现了自己需要的元素按照特定的顺序排序。

【SQL】按照特定所需的元素排序

标签:decode   where   排列   select   想法   函数实现   code   语句   name   

原文地址:http://www.cnblogs.com/contixue/p/7162015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!