您的位置:首页 > 数据库 > Oracle

Oracle SQL 查询优化.Part2

2016-04-03 23:04 405 查看
一、排序:

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;


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: