今天开发问了个查询:
表T有字段a,b,c,都是数字型的
我想select得到的结果排序是这样:
优先按照a降序排列,
a相同且a=1的记录,则按照b字段降序
a相同且a=0的记录,按照c字段降序排
其实很容易想到用oracle函数,case,rank之类的,但是rank只是按A分组后按照B排序,不能既按照B又按照C。
最后用case搞定。
SQL> select * from hmtest;
A B C
---------- ---------- ----------
1 4 5
1 3 6
1 2 1
0 2 6
0 3 5
SQL> select * from hmtest order by a desc,case when a=1 then b else c end desc; (a只有1和0两个值)
A B C
---------- ---------- ----------
1 4 5
1 3 6
1 2 1
0 2 6
0 3 5
嘿嘿,其实很简单,先写篇日志垫垫底,以后多补充些吧。纪念我的DBA之路,也让自己的生活多充实些。
唉,就知道没有这么简单。今天开发把具体的表结构给了,发现排序的两个字段类型不同。
score NUMBER(8,4)
rank_date DATE
stick_flag NUMBER(2)
stick_flag=1的按照 score 降序排序,stick_flag=0的按照rank_date降序排列
select ... from ...where...
order by stick_flag desc,
case
when stick_flag = 1 then
r.rank_date
else
r.score
end desc;
会报错
类型得一致。后来想了想,用伪列来实现的。
select ...
(case when r.stick_flag=1 then r.score else 0 end) ord (新增一列ord,当flag为1时取score的值,当flag为0时统一为0,因为score的值不会小于0)
from....
where ....
order by stick_flag desc,ord desc,r.rank_date desc;