1. 计算一年有多少天
1.1. sql
select 'Days in 2005: '||to_char(add_months(trunc(sysdate,'y'),12)-1,'DDD')as reportfrom dualunion allselect 'Days in 2004: '||to_char(add_months(trunc(to_date('01-SEP-2004'),'y'),12)-1,'DDD')from dual
REPORT
-----------------
Days in 2005: 365
Days in 2004: 366
2. 查找含有数字和字母的字符串
2.1. sql
with v as (
select 'ClassSummary' strings from dual union
select '3453430278' from dual union
select 'findRow 55' from dual union
select '1010 switch' from dual union
select '333' from dual union
select 'threes' from dual
)
select stringsfrom (
select strings,translate(strings,'abcdefghijklmnopqrstuvwxyz0123456789',rpad('#',26,'#')||rpad('*',10,'*')) translatedfrom v) xwhere instr(translated,'#') > 0and instr(translated,'*') > 0
3. 把整数转换成二进制
3.1. sql
ENAME SAL SAL_BINARY
---------- ----- --------------------
SMITH 800 1100100000
ALLEN 1600 11001000000
WARD 1250 10011100010
JONES 2975 101110011111
MARTIN 1250 10011100010
BLAKE 2850 101100100010
CLARK 2450 100110010010
SCOTT 3000 101110111000
KING 5000 1001110001000
TURNER 1500 10111011100
ADAMS 1100 10001001100
JAMES 950 1110110110
FORD 3000 101110111000
MILLER 1300 10100010100
3.2. sql
select ename,sal,(select binfrom dualmodeldimension by ( 0 attr )measures ( sal num,cast(null as varchar2(30)) bin,'0123456789ABCDEF' hex)rules iterate (10000) until (num[0] <= 0) (bin[0] = substr(hex[cv()],mod(num[cv()],2)+1,1)||bin[cv()],num[0] = trunc(num[cv()]/2))) sal_binaryfrom emp
4. 标量子查询转换为复合子查询
4.1. sql
select e.deptno,e.ename,e.sal,(select d.dname,d.loc,sysdate todayfrom dept dwhere e.deptno=d.deptno)from emp e
4.2. SELECT列表里的子查询只允许返回一个值
4.3. sql
create type generic_objas object (val1 varchar2(10),val2 varchar2(10),val3 date
);
4.3.1. 对象类型
4.4. sql
select x.deptno,x.ename,x.multival.val1 dname,x.multival.val2 loc,x.multival.val3 todayfrom (select e.deptno,e.ename,e.sal,(select generic_obj(d.dname,d.loc,sysdate+1)from dept dwhere e.deptno=d.deptno) multivalfrom emp e) x
DEPTNO ENAME DNAME LOC TODAY
------ ---------- ---------- ---------- -----------20 SMITH RESEARCH DALLAS 12-SEP-200530 ALLEN SALES CHICAGO 12-SEP-200530 WARD SALES CHICAGO 12-SEP-200520 JONES RESEARCH DALLAS 12-SEP-200530 MARTIN SALES CHICAGO 12-SEP-200530 BLAKE SALES CHICAGO 12-SEP-200510 CLARK ACCOUNTING NEW YORK 12-SEP-200520 SCOTT RESEARCH DALLAS 12-SEP-200510 KING ACCOUNTING NEW YORK 12-SEP-200530 TURNER SALES CHICAGO 12-SEP-200520 ADAMS RESEARCH DALLAS 12-SEP-200530 JAMES SALES CHICAGO 12-SEP-200520 FORD RESEARCH DALLAS 12-SEP-200510 MILLER ACCOUNTING NEW YORK 12-SEP-2005
4.5. 对象本身是一个标量值,它并不会违反标量子查询的规则
5. 解析串行化的数据
5.1. sql
STRINGS
-----------------------------------
entry:stewiegriffin:lois:brian:
entry:moe::sizlack:
entry:petergriffin:meg:chris:
entry:willie:
entry:quagmire:mayorwest:cleveland:
entry:::flanders:
Entry:robo:tchi:ken:
5.1.1. sql
create view Vas
select 'entry:stewiegriffin:lois:brian:' stringsfrom dualunion all
select 'entry:moe::sizlack:'from dualunion all
select 'entry:petergriffin:meg:chris:'from dualunion all
select 'entry:willie:'from dualunion all
select 'entry:quagmire:mayorwest:cleveland:'from dualunion all
select 'entry:::flanders:'from dualunion all
select 'entry:robo:tchi:ken:'from dual
5.2. sql
VAL1 VAL2 VAL3
--------------- --------------- ---------------
moe sizlack
petergriffin meg chris
quagmire mayorwest cleveland
robo tchi ken
stewiegriffin lois brian
willieflanders
5.2.1. sql
with cartesian as (select level idfrom dualconnect by level <= 100)select max(decode(id,1,substr(strings,p1+1,p2-1))) val1,max(decode(id,2,substr(strings,p1+1,p2-1))) val2,max(decode(id,3,substr(strings,p1+1,p2-1))) val3from (select v.strings,c.id,instr(v.strings,':',1,c.id) p1,instr(v.strings,':',1,c.id+1)-instr(v.strings,':',1,c.id) p2from v, cartesian cwhere c.id <= (length(v.strings)-length(replace(v.strings,':')))-1)group by stringsorder by 1
6. 计算比重
6.1. Oracle支持内置函数RATIO_TO_REPORT
6.2. sql
select job,num_emps,sum(round(pct)) pct_of_all_salariesfrom (
select job,count(*)over(partition by job) num_emps,ratio_to_report(sal)over()*100 pctfrom emp)group by job,num_emps
7. 正则表达式功能
7.1. Oracle Database 10g
7.2. sql
select emp_id, textfrom employee_commentwhere regexp_like(text, '[0-9]{3}[-. ][0-9]{3}[-. ][0-9]{4}')and regexp_like(regexp_replace(text,'[0-9]{3}([-. ])[0-9]{3}\1[0-9]{4}',''),'[0-9]{3}[-. ][0-9]{3}[-. ][0-9]{4}')EMP_ID TEXT
---------- ----------------------------------------------------------7369 126 Varnum, Edmore MI 48829, 989 313-53517844 989-387.53599999 906-387-1698, 313-535.8886