SQL经典实例(二)查询结果排序

依据子串排序

从emp表检索员工的名字和职位,并且按照职位字段的最后两个字符对检索结果进行排序
MySQL & Oracle

select ename, job
    from emp
  order by substr(job, length(job)-2);

对含有字母和数字的列排序

考虑如下视图:

create view V
as 
select ename || ' ' deptno as data
    from emp;
select * from V;

clipboard.png

以DEPTNO或者ENAME作为排序项。使用REPLACETRANSLATE函数修改用于排序的字符串
Oracle 按DEPTNO排序

select data
    from V
order by replace(data,
         replace(
         translate(data,'0123456789','##########'),'#',''),'');

Oracle 按ENAME排序

select data
    from V
order by replace(
        translate(data,'0123456789','##########'),'#','');

排序时对NULL值的处理

通用方式:使用case when语句标记NULL值与非NULL值

select ename, sal, comm from (
        select ename, sal, comm,
            case when comm is null then 0 else 1 end as is_null
        from emp
    ) x
order by is_null desc, comm;

针对Oracle 9i及后续版本,可以使用ORDER BY子句的扩展语法NULLS FIRST和NULLS LAST来决定NULL值位置,无需考虑非NULL值的排序方式

select ename, sal, comm
    from emp
order by comm nulls first --nulls last;

根据条件逻辑动态调整排序项

例如,如果JOB等于SALESMAN,就按照COMM来排序;否则,按照SAL排序。

select ename, sal, job, comm
    from emp
order by case when job = 'SALESMAN' then comm else sal end;
《SQL经典实例》第二章
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值