数字 acl 完全 ase 我们 注意 ger 其他
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】按照特定所需的元素排序
来源: http://www.bubuko.com/infodetail-2168197.html