--取随机的数据 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'