一、排序:
1. 按返回列的顺序排序:
通常排序都是 order by 后边加列名,也可以写为 order by 后边加列所在的次序。下边的查询结果是一样的:
-- order by 加返回列所在的次序 select emp.empsalary, emp.* from emp order by 1 asc -- order by 加列名 select emp.empsalary, emp.* from emp order by emp.empsalary asc
![]()
其中,利用返回列所在次序排序可以应用在“动态指定排序列”的情况下,比如上边的 sql 结果第一列可以按需求返回为 empsalary、empno...或其他列,但是排序仍然是 order by 1,指定是第一列,这样就动态指定了排序的列。但实际应该没人会用,个人也不推荐,写到程序里不好维护。
2. 处理排序空值:
Oracle 默认正序排序(asc)空值排在后边,倒序排序(desc)空值排在前边。如果无论是正序或倒序,都想按自己意愿把空值排在前边或后边,不受 asc 或 desc 制约,可以使用 nulls first 或 nulls last 关键字。此处只以倒序举例,正序也是同样道理:
-- desc,null排在前边 select emp.empsalary, emp.* from emp order by emp.empsalary desc
正如上边查询结果,倒序排序默认 null 排在前边。现在想让 null 排在后边,用 nulls last 可以实现:
-- desc,null排在前边 select emp.empsalary, emp.* from emp order by emp.empsalary desc nulls last
3. 在 order by 语句中,也可以使用 case when 语句:在同一个 sql 中,可以“条件分组后按照不同字段排序”。这在某些情况下就可以替代 1 中所说的“按照不同条件指定不同列进行排序”。下边是 order by 中使用 case when 语句:
select * from emp where emp.empsalary is not null order by case when emp.empsalary > 3000 then emp.empname else emp.empno end asc;
但是,值得注意的是排序的字段数据类型必须相同,即:字符型和数字型不能同时用于 order by case when 中的排序字段。例如下边这句就会报错“ORA-00932:数据类型不一致:应为 CHAR, 但却获得 NUMBER”
select * from emp where emp.empsalary is not null order by case when emp.empsalary > 3000 then emp.empno else emp.empsalary end asc;
二、translate 字符串替换:
1. translate 函数的使用:
translate 可以做字符串的替换,语法:translate(exp, from_string, to_string),from_string 与 to_string 以字符为单位,逐一对应,逐一替换。例如下边,exp 字符串中的‘a’字符都被‘1’替换、‘b’都被‘2’替换...依次类推:
select translate('ab 你好 cbabcdef', 'abcdef', '123456') new_str from dual;
2. 如果 to_string 为空,返回 null:
select translate('ab 你好 cbabcdef', 'abcdef', '') new_str from dual;
3. 如果 to_string 对应位置没有字符,那么 from_string 这个位置上的列出字符,在 exp 中都会消掉:
select translate('ab 你好 cbabcdef', '1abcdef', '1') new_str from dual;