1.实现取值转换

select decode(t.trans_sub_type, 'Q', '1', 'D', '2', 'T1', '3','D1', '4') as trans_sub_type,t.trans_seq,t.trans_date from trans_info_log t where trans_status='04' order by create_time desc

decode函数是对trans_sub_type这个字段的取值做判断,DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )

 

2.查询100个中排名第67的做法,三重嵌套

select * from (
select a.*,rownum from
( select t.* from aab t order by t.xinshui desc ) a
where rownum<=67 order by rownum desc
) where rownum=1

有排序,那么就是三重嵌套rownum或者分析函数两重搞定
分析函数如下实现:
select * from
(select a.*, rank() over(order by xinshui desc) as lev from aab a)
where lev=2

rownum的使用必须要包括第一条记录, 也就是 rownum >= 1 这个语句可以,
而rownum > 1 则不可以, 因为这个条件中rownum为1时就不成立了.
所以直接使用 rownum=2 也不会有结果显示, 因为 1 != 2.
在这种情况下就是利用嵌套查询来实现了!~

 

3.查重复--自关联

select merchant_code from route_merch_pool_map where merchant_code in (select merchant_code from route_merch_pool_map group by merchant_code having count(1) >= 2)

 

4.查询某2个时间相差多少分钟

select t.*
from info_log t
where to_number((to_date(t.trans_success_time, 'yyyymmddhh24miss') -
to_date(t.trans_date, 'yyyymmddhh24miss')) * 24 * 60) > 6;

特别注意年月日时分秒,不能使用java方式yyyymmddhhMMss,而在Oracle中的日期格式是不区分大小写的,所以 mm 出现了两次,会报“format code appears twice”的错误,相减得到的是天,在转换成分钟即可。

 

5.匿名块(每次使用均需要进行编译,不能存储在数据库中且不能被其他PL/SQL调用)

Declare
merchant_code varchar2(40);
begin
merchant_code := 'FASTBILL@aaa333'; --赋值方式
insert into ...;
end;

 

 

6.命名块(存储过程,存储函数,触发器:一经编译后面就可直接调用,且可以存储在数据库中,被其他PL/SQL 调用)

 

7.使用in时有条数限制,可以使用如下方式做sql优化。

select *
from aaa t
where t.status = '00'
and exists (select 1
from bbb tc
where tc.status = '00'
and tc.group_id = t.id)

 

8.在plsql命令窗口执行sql语句保存到文件的方法

spool v:\a.xls

select * from ....;

spool off

posted on 2018-09-28 18:00  慢乌龟  阅读(231)  评论(0编辑  收藏  举报