Oracle查询优化改写_2

对应的第二章”给查询结果排序“


1.按指定列排序
select ename,comm from emp order by comm ASC;

select ename,comm from emp order by 2 ASC;
--按照第二列排序
2.TRANSLATE函数
语法:

  TRANSLATE(string,from_str,to_str)

功能:

1. from_str和to_str以字符为单位,对应字符一一替换。

2. TRANSLATE是REPLACE所提供的功能的一个超集

3. 如果from_str比to_str长,那么在from_str中而不在to_str中而外的字符将从string中被删除,因为它们没有相应的替换字符.

4. to_str不能为空.Oracle把空字符串认为是NULL,并且如果TRANSLATE中的任何参数为NULL,那么结果也是NULL
3.数字和字母混合字符串的字母排序

此时可以使用到上述的 TRANSLATE函数。

select '7876 Andy' as aname,translate('7876 Andy','- 0123456789','-') as ename from dual
4.空值排序的问题

Oracle默认排序空值在后面,如果要把空值显示在前面,如何实现?

首先想到的是 nal,实现如下:

select ename,comm,nvl(comm,-1) order_col from emp order by 3;

上述的SQL的确可以实现这个功能。但是,必须关注排序列的数据类型。

其实,可以使用关键字

NULLS FIRST 和 NULLS LAST

来控制排序时,空值在前还是在后。

select ename,comm from emp order by 2 NULLS FIRST;
5.排序的列有条件限制

条件:领导对工资在1000—2000之间的员工更感兴趣,再按工资升序排列。

select empno AS 编码,ename AS 姓名,
    case when sal >=1000 and sal < 2000 then 1 else 2 end AS 级别,
    sal AS 工资
    from emp where deptno = 30 order by 3,4;

结果如下:

编码 姓名 级别 工资
7654 MARTIN 1 1250
7521 WARD 1 1250
7499 ALLEN 1 1600
7900 JAMES 2 950
7698 BLAKE 2 2850

也可以不显示级别,把 case when 放到 order by 中

select empno AS 编码,ename AS 姓名,
    sal AS 工资
    from emp where deptno = 30
    order by case when sal >=1000 and sal < 2000 then 1 else 2 end, 3;

结果如下:

编码 姓名 工资
7654 MARTIN 1250
7521 WARD 1250
7499 ALLEN 1600
7900 JAMES 950
7698 BLAKE 2850

猜你喜欢

转载自blog.csdn.net/yhzhaohy/article/details/81018896