asc desc排序_SQL的高级自定义排序

0f4139ccf6ff0b0d30eb80aec728cabf.png

SQLZOO平台上有一道题,题目如下:

9446bc089b740d624ac15916cbdb2ecb.png

要求:查找1984年获奖者和主题,按主题和获胜者名称排序,并把化学奖和物理奖排到最后面显示

难点:把化学奖和物理奖排到最后面显示,这种自定义排序不能简单使用升序ASC或降序DESC

猴子老师的答案和解释如下:

-- 答案
select winner, subject
from nobel
where yr=1984
order by subject in ('Physics','Chemistry'),subject,winner;

9db3ac0a28cda4891a8954101a6d3d77.png

sql解释:
subject in ('Physics','Chemistry')返回值(0或者1),
会对每一个subject做一个if的判断,有的是1,没有的是0
再用order by把这些值排序在下面
这两个科目('Physics','Chemistry')的就是0排在前边,
是这两个科目的返回1就排在后边了。
因为化学和物理科目题目要求在后面,所以引入此函数出现0、1,达成题目的要求

解题的关键是subject in ('Physics','Chemistry'),order by 根据返回值进行排序,这样就可以实现自定义排序。

根据以上原理,对下面题目举一反三:

e764f257adaed323d7945e134cabc6c1.png
-- sname中h开头的排最前面,其余的升序排列
select sname
from test
order by sname like 'h%' desc ,sname asc;

98ae4dd116c0e3f7dcf2b41f40a62e29.png

sql解释:
sname like 'h%'返回值(0或者1),
首先对每一个sname做一个if的判断,h开头的是1,非h开头的是0
再用order by把这些值降序排列
这样h开头的排在前边

同理,如果要求h开头的排最先,然后是z开头的,其余的按升序排序,则可再加一个判断条件:

-- sname中h开头的排最前面,然后是z开头的,其余的升序排列
select sname
from test
order by sname like 'h%' desc ,sname like 'z%' desc ,sname asc;

cb9e0f07fae2a50a97754db20a298d03.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值