依据子串排序
从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;
以DEPTNO或者ENAME作为排序项。使用REPLACE和TRANSLATE函数修改用于排序的字符串
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经典实例》第二章
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。