首页 > 其他 > 详细

几个小知识点

时间:2015-03-25 16:51:39      阅读:271      评论:0      收藏:0      [点我收藏+]
--取随机的数据
select empno,ename from ( select a.*,rownum rn from emp a order by dbms_random.value ) where rn<2;

--coalesce 将空转为0  --推荐用此方法 返回第一个不为空的表达式,如果都为空则返回空值。
select a.*,coalesce(comm,0)comm from emp a where empno=7369 ;  
select coalesce(null,3+5,4+6) value from dual; 
select a.*,nvl(comm,0)comm from emp a where empno=7369 ;  


--like查询下划线开头的字符
update emp set ename=_||job where empno=7788;

select * from emp where ename like \_% escape \;

--从右向左截取
select a.*,substr(job,-2) from emp a where empno=7369;    --从右边第一位开始,截取2 位
select a.*,substr(job,-2,1) from emp a where empno=7369;  --从右边第二位开始,截取 1位

--order by 中用 case when 
select empno,sal,case when sal>=3000 then 1 else 2 end as rn from emp order by 3 ,2 desc; 
select empno,sal  from emp order by case when sal>=3000 then 1 else 2 end,2 desc; 


--translate 函数  translate(字段,from_string,to_string) 如果 from_string 比to_string 长
-- from_string中有而 to_string没有的,这些没有的字符将从字段中被替换为空,也就是删除的意思,9i,10g 11g 都适用
select prid,praddr,translate(praddr,a 0123456789,a) from prov; 

select translate(afdfadf你好,1你好,1) from dual; 


-----------------------------------------------------------------------------------------------------------------------
--正则表达式用法示例
-- regexp_replace  如果字符中既有数字也有汉字,可以用如下方式提取数字和汉字

--提取汉字
select prid,praddr,regexp_replace(praddr,[0-9])rn from prov where prid=100252;

--提取数字
select prid,praddr,regexp_replace(praddr,[^0-9])rn from prov where prid=100252;


--regexp_like  查找 ename 中有 A 字符的
select * from emp where regexp_like(ename,A);
select * from emp where regexp_like(ename,a,i);  --i 不区分大小写 ,c 区分大小写,默认为区分大小写

--查找 以A开头的
select * from emp where regexp_like(ename,^A);

--查找 以 N 结尾的
select * from emp where regexp_like(ename,N$);

--查找包含下划线的
select * from emp where regexp_like(ename,_);

---regexp_substr
select a.*,regexp_substr(ename,A,1,1,i)rn from emp a where empno=7499; 

 --以一个或以上逗号开头,从第一位开始,第一次出现的位置,下面截取左边的 34 
SELECT REGEXP_SUBSTR(34,56,-23,[^,]+,1,1,i) AS STR FROM DUAL; 


--分段截取数字
SELECT REGEXP_SUBSTR(34,56,-23, [^,]+, 1, LEVEL, i) AS STR
  FROM DUAL  
CONNECT BY LEVEL <=  
           LENGTH(34,56,-23) - LENGTH(REGEXP_REPLACE(34,56,-23, ,, ‘‘))+1;  



--regexp_instr 某个字符串出现的位置
Select instr(avdsdabasdab,a,1,2)rn FROM DUAL; 
select regexp_instr(avdsdabasdab,a,1,3)rn  from dual; --从第一位开始,查找a第三次出现的位置

--regexp_count  某个字符串出现的次数
select regexp_count (The pro-niece was born today, so exciting!, o, 23, i)rn from dual;


---------------------------------------------------------------------------------------------------------------------------------------------------

--闪回版本查询及 闪回事物查询
select * from emp; 
update scott.emp set comm=1000

--查所有时间闪回版本查询
select versions_starttime, versions_endtime, versions_xid, 
versions_operation, empno 
from scott.emp versions between timestamp minvalue and maxvalue
order by VERSIONS_STARTTIME

--按时间段查
select empno, versions_starttime, versions_endtime,versions_xid
from scott.emp versions
between timestamp 
to_date(2015-03-23 16:15:00,yyyy-mm-dd hh24:mi:ss)
and to_date(2015-03-23 16:19:00,yyyy-mm-dd hh24:mi:ss)

--闪回事物查询
alter database add supplemental log data;  --启用最小补充日志
select *  from flashback_transaction_query  where table_owner=SCOTT and xid=08000D0014030000

 

几个小知识点

原文:http://www.cnblogs.com/tianmingt/p/4366039.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!