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',0),id desc

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

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

最新文章

  1. C#学习总结之集合
  2. 【原】iOS容易造成循环引用的三种场景,就在你我身边!
  3. web页面的加载顺序
  4. iOS中发送HTTP请求的方案
  5. SQL Server中,Numric,Decimal,Money三种字段类型的区别
  6. ECSHOP验证码背景图修改教程
  7. UINavigationController的使用(多视图控制器)
  8. VC6.0编译boost
  9. Linux编程之《进程/线程绑定CPU》
  10. hdu4177:Super Mario
  11. 如何用一个语句判断一个整数是不是二的整数次幂——从一道简单的面试题浅谈C语言的类型提升(type promotion)
  12. HDOJ 1598 Kruscal
  13. javascript日历插件
  14. Pivot Index--Google
  15. tomcat+jdk+mysql
  16. Orleans的集群构建
  17. Alpha冲刺! Day5 - 砍柴
  18. nodejs的process模块如何获取其他进程的pid
  19. 关于VIM自动缩进失效(filetype indent on无效)的详细分析
  20. UML类图简单学习 各种对象、关系UML表示法

热门文章

  1. Java注释@interface的用法【转】 --好文章 很好理解
  2. 一个App架构例子分析--UI层使用MVP模式;各层之间使用Otto实现通信
  3. 2018DDCTF Misc部分WP
  4. clientX,offsetX,layerX,pageX,screenX,X鼠标位置全解
  5. tornado简单使用
  6. 64_m1
  7. 开源网络准入系统(open source Network Access Control system)
  8. 异步网络模块之aiohttp的使用(一)
  9. 2015多校第6场 HDU 5360 Hiking 贪心,优先队列
  10. 给自己立一个flag