select GEOCOORDINATES, REGEXP_SUBSTR(GEOCOORDINATES, '[^,]+', 1, 1) lng, REGEXP_SUBSTR(GEOCOORDINATES, '[^,]+', 1, 2) lat from SCM_CITYCOMPONENT;
rownum
前N条数据
1
select * from user where rownum <= N;
第N条数据
1
select * from user where rownum = N;
union 与 union all
union all 仅仅是简单的合并查询结果, 并不会做去重操作, 也不会排序, 所以 union all 效率要比 union 高,在确定没有重复记录的情况下, 尽量使用union all
根据索引查询时,union 比 or 效率更高。or 不会使用索引
union 或者 union all 与 order by 的联合使用
1 2 3 4 5
select * from(select * from table order by a) union select * from (select * from table1 order by b) union select * from (select * from table2 order by c);
select AFFIXID+ROWNUM as AFFIXID,PROCID, EVENTCODE, FILETYPE, AFFIXTYPE, '/scm'||AFFIXURL AFFIXURL from (SELECT AFFIXID,PROCID, EVENTCODE, FILETYPE, AFFIXTYPE, substr(a.AFFIXURL, instr(a.AFFIXURL, '/scm', 1, levels.lvl) + M, instr(a.AFFIXURL, '/scm', 1, levels.lvl +1) - (instr(a.AFFIXURL, '/scm', 1, levels.lvl) +1) - N) as AFFIXURL FROM (SELECT AFFIXID,PROCID, EVENTCODE, FILETYPE, AFFIXTYPE, '/scm'|| AFFIXURL ||'/scm'AS AFFIXURL, (length(AFFIXURL ||'/scm') - nvl(length(REPLACE(AFFIXURL, '/scm')), 0)) / M AS cnt FROM SCM_AFFIX where EVENTCODE like'C20200710%'and length(AFFIXURL) >55) a, (SELECT rownum AS lvl FROM (SELECT (MAX(length(AFFIXURL ||'/scm') - nvl(length(REPLACE(AFFIXURL, '/scm')), 0))) / M max_len FROM SCM_AFFIX where EVENTCODE like'C20200710%'and length(AFFIXURL) >55) CONNECTBY LEVEL <= max_len) levels WHERE levels.lvl <= a.cnt ORDERBY AFFIXID, levels.lvl) a where a.AFFIXURL isnotnull
查看表中多余的重复记录,重复记录是根据单个字段(pid)来判断
1
select * from SGP_PREGNANCY where pid in (select pid from SGP_PREGNANCY group by pid having count(pid) > 1)
清除查询缓存
1 2 3
ALTERSYSTEM FLUSH SHARED_POOL ALTERSYSTEM FLUSH BUFFER_CACHE ALTERSYSTEM FLUSH GLOBAL CONTEXT
分页优化
1 2 3 4 5 6 7 8 9 10 11 12 13
// 普通分页 select*from (select rownum rn, p.*from ( select g.*from SGP_PERSON g WHERE1=1 ) p where rownum<=239178) where rn >239168
// 优化后分页 select*from SGP_PERSON where rowid in ( select rid from (select rownum rn, rid from ( SELECT rowid rid, g.*from SGP_PERSON g WHERE1=1 ) where rownum<=239178) where rn >239168)
函数
replace
示例:
1 2 3 4 5
//name 字段值中逗号替换为空 replace(name, ',')
//name 字段值中逗号替换为# replace(name, ',', '#')
dbms_random.value
获取 0-1 之间随机值
1 2
// 获取 80 到 100之间随机小数,小数点后保留两位 SELECT TRUNC(80+20*dbms_random.value, 2) FROM dual
trunc
日期
1 2 3 4 5 6 7 8
select trunc (sysdate) from dual --2013-01-06 今天的日期为 2013-01-06 select trunc (sysdate, 'mm') from dual --2013-01-01 返回当月第一天. select trunc (sysdate,'yy') from dual --2013-01-01 返回当年第一天 select trunc (sysdate,'dd') from dual --2013-01-06 返回当前年月日 select trunc (sysdate,'yyyy') from dual --2013-01-01 返回当年第一天 select trunc (sysdate,'d') from dual --2013-01-06 (星期天) 返回当前星期的第一天 select trunc (sysdate, 'hh') from dual --2013-01-06 17:00:00 当前时间为 17:35 select trunc (sysdate, 'mi') from dual --2013-01-06 17:35:00 TRUNC () 函数没有秒的精确
数字
TRUNC(number,num_digits) Number 需要截尾取整的数字。 Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。 TRUNC () 函数截取时不进行四舍五入
1 2 3 4 5 6 7 8 9
select trunc(123.458) from dual --123 select trunc(123.458,0) from dual --123 select trunc(123.458,1) from dual --123.4 select trunc(123.458,-1) from dual --120 select trunc(123.458,-4) from dual --0 select trunc(123.458,4) from dual --123.458 select trunc(123) from dual --123 select trunc(123,1) from dual --123 select trunc(123,-1) from dual --120
SELECT ENAME,SAL,JOB, CASE JOB WHEN 'MANAGER' THEN SAL+100 WHEN 'ANALYSIS' THEN SAL+200 WHEN 'SALESMAN' THEN SAL+300 ELSE SAL+400 END "RESULTS" FROM EMP;