oracle函数还是很重要的,可以增强sql语句功能,在这里简单讲下关于oracle11g环境下的一些函数理解:
Concat:连接两个不同的列,concat只能接受两个参数。
/*
Concat:连接两个不同的列,concat只能接受两个参数
*/
select job,mgr,concat(job,mgr) from emp; --CLERK 7902 CLERK7902
select concat(1,1) from dual; --11
select concat('a',1) from dual; --a1
select 'a'|| 1 from dual; --a1
select concat('c',concat('a','b')) from dual; --cab
greatest()返回列表中最大值,least()返回表中最小值。
/*
greatest返回列表中最大值
*/
select greatest (1,2,3) from dual; --3
select greatest (1,2,-3) from dual; --2
select greatest ('a','b','c') from dual; --c
select greatest('a','b','B') from dual; --b
select greatest('a','A','b') from dual; --b
select greatest('a','b',null) from dual; -- -
select greatest( 'a','V',1000000) from dual; --a
select greatest( 'a','v',1000000) from dual; --v
/*
least返回表中最小值
*/
select least(1,2,3) from dual; --1
select least (1,2,-3) from dual; ---3
select least ('a','b','c') from dual; --a
select least('a','b','B') from dual; --B
select least('a','A','b') from dual; --A
select least('a','b',null) from dual; -- -
select least( 'a','V',1000000) from dual; --1000000
select least( 'a','v',1000000) from dual; --1000000
select least('a','A','-3',2) from dual; ---3
trunc:对date或数值类型截取,不进行四舍五入,返回指定的值。
trunc()函数没有秒的精确,即秒是以00来显示的,可以和(sysdate -1)的时间进行比较;
trunc(number,num_digits)
number 需要截尾取整的数字;
num_digits 用于指定取整精度的数字。num_digits 的默认值为0。
/*
trunc:对date或数值类型截取,返回指定的值
trunc()函数没有秒的精确,即秒是以00来显示的,可以和(sysdate -1)的时间进行比较
该函数截取时不进行四舍五入
yyyy当年第一天 mm当月第一天 dd当前年月日 d当前星期第一天(星期天) hh当前时间 mi当前分钟
*/
select sysdate from dual; --2018/12/5 10:08:46 返回当前具体时间
select trunc(sysdate,'yy') from dual; --2018/1/1 返回当年第一天
/*
trunc(number,num_digits)
number 需要截尾取整的数字
num_digits 用于指定取整精度的数字。num_digits 的默认值为0
*/
select trunc(45.789) from dual; --45
select trunc(45.789,1) from dual; --45.7
select trunc(45.789,3) from dual; --45.789
select trunc(45.789,4) from dual; --45.789
select trunc(45.789,-1) from dual; --40
select trunc(45.789,-2) from dual; --0
select trunc(45.789,-4) from dual; --0
--案例
select trunc(sysdate),
trunc(sysdate -1),
sysdate -1,
trunc(sysdate,'mi'),
trunc(to_date('19-02-1997 06:12','dd-mm-yyyy hh:mi')),
trunc(to_date('19-02-1997 06:12','dd-mm-yyyy hh:miAM'),'mi') from dual;
replace(char,search_string,replacement_string)该函数需要三个参数,
第一个参数是需要搜索的字符串,第二个参数是搜索的内容,第三个参数是替换的内容,如果第三个参数省略,则默认为空格,如果第二个参数是null,那么将只执行搜索操作而不会替换任何内容。
注意,第二个参数注意大小写,且不能为空
translate(char,from,to)将char中出现的from替换为to中相应的字符,
如果from的长度大于to的长度,那么将from大于to的长度之后的出现在char中的字符删除。
注意第二个和第三个参数不能为空,且第二个参数不能为null。
/*
Replace和translate替代函数
replace(char,search_string,replacement_string)该函数需要三个参数,
第一个参数是需要搜索的字符串,第二个参数是搜索的内容,第三个参数是替换的内容,
如果第三个参数省略,则默认为空格,如果第二个参数是null,
那么将只执行搜索操作而不会替换任何内容
注意,第二个参数注意大小写,且不能为空
*/
select ename,replace(ename,'A','b') from emp; --ALLEN bLLEN
select ename,replace(ename,'A') from emp; --ALLEN LLEN
select ename,replace(ename,null) from emp; --ALLEN ALLEN
/*
translate(char,from,to)将char中出现的from替换为to中相应的字符,
如果from的长度大于to的长度,那么将from大于to的长度之后的出现在char中的字符删除
注意第二个和第三个参数不能为空,且第二个参数不能为null
*/
select ename,translate(ename,'A','b') from emp; --ALLEN bLLEN
select ename,translate(ename,'A') from emp; --错误,参数个数无效
select ename,translate(ename,null) from emp; --错误,参数个数无效
--replace和translate函数的区别
select replace('abcdef','abcf','t') from dual; --abcdef
select replace('abcdefabdscf','abcf','t') from dual; --abcdefabdscf
select replace('abcdefabdscfsd','abcf','t') from dual; --abcdefabdscfsd
select translate('abcdef','abcf','t') from dual; --tde
select translate('abcdefabdscf','abcf','t') from dual; --tdetds
select translate('abcdefabdscfsd','abcf','t') from dual; --tdetdssd
在理解translate()替换函数时,我用自己的理解简单说下吧:
在语句select translate('abcdefabdscf','abcf','t') from dual;中,首先了解第二个参数abcf将替换为第三个参数中相应的字符,且abcf参数大于t,即a对应t,后面bcf字符删掉。所以在abcdefabdscf中a全部替换为t,里面的bcf全部删除,即输出结果为tdetds。
5、Chr()和Ascii()函数
chr():将ASCII码转换为字符---------------------详情可以百度char码值对应列表;
ASCII():将字符转换为ASCII码。
/*
chr()函数与ASCII()函数
chr():将ASCII码转换为字符
ASCII():将字符转换为ASCII码
*/
select chr(101) from dual; --e
select ascii('E') from dual; --69
select chr(32) from dual; -- -
select replace('xxxx yyy zzz',chr(32),'') from dual; --xxxxyyyzzz char(32)为空格符,所以将xxxxyyyzzz中的空格符替换了
6、LPAD()和RPAD()函数
这两个函数用于填充,最少需要两个参数,最多需要三个参数,
第一个参数表示需要处理的字符串,第二个参数是需要将字符串扩充的宽度,第三个参数表示用什么字符来做填充。第三个参数默认值为空格,也可以是单个的字符或字符串。
/*
LPAD和RPAD函数
这两个函数用于填充,最少需要两个参数,最多需要三个参数,
第一个参数表示需要处理的字符串,第二个参数是需要将字符串扩充的宽度,
第三个参数表示用什么字符来做填充。第三个参数默认值为空格,也可以是单个的字符或字符串
*/
select lpad(sal,10,'*') from scott.emp; --*******800 ******1600
select rpad(sal,10,'*') from emp; --800******* 1600******
从两个表达式中返回一个非null值,只有两个参数。
注意:e1,e2不能为空。
/*
NVL(e1,e2)函数:从两个表达式中返回一个非null值,只有两个参数
注意:e1,e2不能为空
*/
select nvl(1,null) from dual; --1
select nvl(null,1) from dual; --1
select nvl(1,2) from dual; --1
select nvl(2,1) from dual; --2
select nvl(1,'a') from dual; --错误,标识符无效
select nvl('',1) from dual; --1
select nvl(null,null) from dual; -- -
select nvl('','') from dual; -- -
对日期或数值进行四舍五入运算。
/*
ROUND(m,n):对日期或数值进行四舍五入运算
*/
select round(to_date('1997/02/19','yyyy/mm/dd'),'month') from dual; --1997/3/1
select round(to_date('1997/02/19','yyyy/mm/dd'),'year') from dual; --1997/1/1
select round(to_date('1997/02/19','yyyy/mm/dd'),'day') from dual; --1997/2/16
select 99.95,round(99.5) from dual; --100
9、substr(e,m,n):截取子串
substr函数有三个参数,第一个参数为目标字符串,第二个参数是将要输出的子串的起点,第三个参数是将要输出的子串的长度,如果没有第三个参数,则余下的字符全部输出。
/*
substr(e,m,n):截取子串
substr函数有三个参数,第一个参数为目标字符串,第二个参数是将要输出的子串的起点
第三个参数是将要输出的子串的长度,如果没有第三个参数,则余下的字符全部输出
*/
select ename,substr(ename,2,3) from emp; --ART
select substr(ename,3) from emp; --RTIN
①trim(string):去除指定字符串string的左右空格,string中间的空格不会被去除;
②ltrim(string):去除指定字符串string左侧的空格;
③rtrim(string):去除指定字符串string右侧的空格;
④trim(leading | trailing | both string1 from string2)从string2中去除左侧|右侧|两侧(默认是both)的string1字符。
注意:string1只能是单个字符。
/*
trim(string):去除指定字符串string的左右空格,string中间的空格不会被去除
ltrim(string):去除指定字符串string左侧的空格
rtrim(string):去除指定字符串string右侧的空格
trim(leading | trailing | both string1 from string2)从string2中去除左侧|右侧|两侧(默认是both)的string1字符
注意:string1只能是单个字符
*/
select trim (' aaa bbb ccc ') || 'a' from dual; --aaa bbb ccca
select ltrim(' aaa bbb ccc ' ) || 'a' from dual; --aaa bbb ccc a
select rtrim(' aaa bbb ccc ') || 'a' from dual; -- aaa bbb ccca
select trim(trailing ' ' from' aaa bbb ccc ') || 'a' from dual; -- aaa bbb ccca
/*
行转列函数:wm_concat()和listagg()函数
wmsys.wm_concat()是oracle10g推出的,在12c中已经彻底删除,所以推荐在用到行转列函数时,使用oracle11g推出的listagg()函数
*/
select wmsys.wm_concat(ename) from emp;
--分组函数
select deptno,listagg(ename,',') within group (order by sal) name from emp group by deptno;
--分析函数
select deptno,ename,sal,listagg(ename,',') within group (order by sal) over(partition by deptno) name from emp;