第四章:Oracle的单行函数

目录

一、字符函数

大小写控制函数:这类函数用于改变字符的大小写。

字符控制函数

二、数值函数 

三、日期和时间函数

四、转换函数 

五、通用函数

六、条件表达式 

七、嵌套函数


一、字符函数

字符函数的输入参数为字符类型,其返回值是字符类型或数字类型。字符函数分为以下两类:

  • 大小写控制函数(upper、lower、initcap)
  • 字符控制函数(concat、substr、length、instr、lpad、rpad、trim、replace)

大小写控制函数:这类函数用于改变字符的大小写。

  • upper(char):该函数用于将字符串转换为大写格式。
  • lower(char):该函数用于将字符串转换为小写格式。
  • initcap(char):该函数用于将字符串中的每个单词的首字母大写,其它字符小写。

字符控制函数

  • concat(str1,str2):该函数用于字符串的连接,str1和str2用于指定被连接字符串。例:concat('hello','oracle')    结果:hellooracle
  • substr(char,m[,n]):该函数用于截取字符串,char指定源字符串,m用于指定从哪个位置开始截取,n用于指定截取字符串的长度。如果m为0,则从首字母开始,如果m为负数,则从尾部开始。例:
  1. sub('hello',1,3)    结果:hel
  2. sub('hello',0,3)    结果:hel
  3. sub('hello',-1,1)    结果:o
  • length(char):该函数用于返回字符串的长度,字符串后的后缀空格也记作字符串的长度。例:length('oracle ')    结果:7
  • instr(char1,char2[,n[,m]]):该函数用于取得子字符串在字符串中的位置,char1用于指定源字符串,char2用于指定子串,n用于指定起始搜索位置(默认值:1),m用于指定子串的第m次出现的次数(默认值:1)。例:
  1. instr('hello oracle','oracle')    结果:7
  2. instr('hello oracle hello oracle','oracle',1,2)    结果:20
  • lpad(char1,n,char2):该函数用于在字符串的左端填充字符,char1用于指定源字符串,char2用于指定被填充的字符,n用于指定填充后的char1的总长度。例:lpad('hello',10,'#')    结果:#####hello
  • rpad(char1,n,char2):该函数用于在字符串的右端填充字符,char1用于指定源字符串,char2用于指定被填充的字符,n用于指定填充后的char1的总长度。例:rpad('hello',10,'#')    结果:hello#####
  • replace(char,search_string[,replacement_string]):该函数用于替换字符串的子串内容。char用于指定源字符串,search_string用于指定被替换字符串,replacement_string用于指定替换字符串。例:replace('hello oracle','oracle','world')    结果:hello world
--大小写控制函数
--upper
select * from emp where job = upper('salesman');

--lower
select * from emp where lower(job) = 'clerk';

--initcap
select empno, initcap(ename) from emp;

--upper、lower、initcap这三个函数的共同点,如果输入参数值为null时,则返回null
select empno, initcap(null) from emp;

--字符控制函数

--字符串连接符,实现雇员名与工资两列的连接
select ename || ':' || sal from emp;

--字符串连接的函数concat,实现雇员名与工资两列的连接
select concat(concat(ename,':'),sal) from emp;

--截串函数 substr
select * from emp where substr(job,1,4) = 'SALE';

--求字符串长度的函数 length
select * from emp where length(ename) = 6;

--instr 求子串在字符串中的位置
select instr('hello oracle','oracle') from dual;

select instr('hello oracle hello oracle', 'oracle', 1, 2) from dual;

--左填充函数 lpad
select lpad(job,9,'*') from emp;

--右填充函数 rpad
select rpad(job, 9, '*') from emp;

--替换函数 replace
select replace('hello oracle','oracle','world') from dual;

二、数值函数 

数值函数的输入参数和返回值都是数字类型。常用的数值函数有:round()、trunc()、mod()。


  • round(n[,m]):该函数用于返回四舍五入的结果,其中n可以是任意数字,m必须是整数(m若为负数,则保留小数点前m位)。例:
  1. round(25.328)    结果:25
  2. round(25.328,2)    结果:25.32
  3. round(25.328,-1)    结果:20
  • trunc(n,[m]):该函数用于截取数字,其中n可以是任意数字,m必须是整数。例:
  1. trunc(25.328)    结果:25
  2. trunc(25.328,2)    结果:25.32
  3. trunc(25.328,-1)    结果:20
  • mod(m,n):求模(求余数)。该函数用于取得两个数字相除后的余数。如果数字n位0,则返回结果位m。例:
  1. mod(25,6)    结果:1
  2. mod(25,0)    结果:25
--四舍五入的函数 round

--求员工的日工资
select round(sal/30,2) from emp;

--截断函数 trunc
select round(sal/30,2),trunc(sal/30,2) from emp;

--求余数的函数 Mod

--求员工号为偶数的员工信息
select * from emp where mod(empno,2)=0;

三、日期和时间函数

用于处理日期时间类型的函数。常用的日期时间函数有:sysdate、months_between、add_months、next_day、last_day、round、trunc。


  • sysdate:用于返回当前系统日期
  • months_between(d1,d2):用于返回日期d1和d2之间相差的月数。d1大于d2结果为整数,否则为负数。
  • add_months(d,n):用于返回特定日期时间之后或之前的月份所对应的日期时间。(求出若干月之后的日期)d用于指定日期时间,n可以是任意整数。
  • next_day(d,char):用于返回特定日期之后的第一个工作日所对应的日期。d用于指定日期时间值,char用于指定工作日。注意:当使用该函数时,工作日必须与日期语言匹配,加入日期语言为American,那么周一对应与“Monday”;加入日期语言为简体中文,那么周一对应于“星期一”。
  • last_day(d):用于返回特定日期所在月份的最后一天。
  • round(d[,fmt]):用于返回日期时间四舍五入的结果。d用于指定日期的时间值,fmt用于指定四舍五入的方式。如果fmt为year,则7月1日为分界线,如果设置fmt为month,则16日为分界线。
  • trunc(d[,fmt]):用于截断日期时间数据。d用于指定日期的时间值,fmt用于截断日期时间数据的方法。如果fmt为year,则结果为本年度的1月1日;如果设置fmt为month,则结果为本月1日。
--sysdate
select sysdate-1 昨天 , sysdate 今天, sysdate+1 明天 from dual;

--months_between
select round(months_between(sysdate,hiredate)/12)from emp;

--add_months
select ename,add_months(hiredate,30*12) from emp;

--next_day
select next_day(sysdate,'星期一')from dual;

--last_day
select sysdate,last_day(sysdate) from dual;
select empno,ename,last_day(hiredate) from emp;

--round
select hiredate, round(hiredate,'YEAR'), round(hiredate,'MONTH') from emp where empno=7654;

--trunc
select hiredate, trunc(hiredate,'YEAR'), trunc(hiredate,'MONTH') from emp where empno=7654;

四、转换函数 

该函数用于将数据从一种数据类型转换成另一种数据类型。Oracle可以隐式的(自动的)进行数据类型转换。

显示的数据类型转换:


  • to_char:
  1. 将日期类型转换为字符类型。函数格式:to_char(d[,fmt[,'nlsparams']])。d用于指定日期值,fmt用于指定日期格式模型,‘nlsparams’用于指定日期格式语言。(格式:‘nls_date_language=language’)默认日期显示格式为dd-mon-rr。注意:当在格式模型中增加字符时,必须用双引号引住字符值。
  2. 将数值类型转换成字符类型。函数格式:to_char(n[,fmt])。n用于指定数值,fmt用于指定数字格式的模型。格式模型常用的元素如下 :    9:显示数字,并且会忽略前导0;    0:显示数字,如果位数不足则用0补齐;    .:在指定位置显示小数点;    $:在数字前加美元符号;    L:在数字前加本地货币符号;
  • to_date(char,[,fmt[,'nlsparams']]):用于将字符串转换成日期类型数据。char用于匹配日期数据的字符串,fmt用于指定日期格式模型,'nlsparams'用于指定日期语言。
  • to_number(n[,fmt]):将包含数字的字符串转换成数值类型。n是包含数字的字符串,fmt用于指定数字格式模型。
--隐式数据类型转换的举例
select * from emp where sal>'2000';
select * from emp where hiredate='02-4月-81';

--to_char 日期类型转换成字符类型
select to_char(hiredate,'YYYY-MM-DD') from emp;
select to_char(hiredate,'YYYY"年"MM"月"DD"日"') from emp;
select to_char(hiredate,'DD-MON-RR','NLS_DATE_LANGUAGE=AMERICAN') from emp;

--to_char 数值类型转换成字符类型
select sal,to_char(sal,'L0,000,000.00')from emp;
select sal,to_char(sal,'L9,999,999.99')from emp;
select sal,to_char(sal,'$9,999,999.99')from emp;

--to_date  字符类型转换成日期类型
select ename,hiredate from emp where hiredate>to_date('1981-12-31','YYYY-MM-DD');

--to_number  字符类型转换成数值类型
select ename,sal from emp where sal>to_number('¥2000','L99999');

五、通用函数

此类函数适用于任何数据类型,同时也适用于空值。

处理null:在Oracle9i之前,处理null只能用函数nvl,但从Oracle9i之后,nvl或者nvl2都可以处理null。


  • nvl(expr1,expr2):该函数用于处理null。如果expr1是null,则返回expr2。如果expr1不是null,则返回expr1。
  • nvl2(expr1,expr2,expr3):该函数用于处理null。如果expr1不是null,则返回expr2。如果expr1是null,则返回expr3。
  • nullif(expr1,expr2):该函数用于比较表达式expr1和expr2,如果二者相等,则返回null,否则返回expr1。
  • coalesce(expr1[,expr2][,...]):返回表达式列表中第一个not null表达式的结果。
--nvl
select ename,sal,comm,sal+nvl(comm,0) from emp;

--nvl2
select ename,sal,comm,nvl2(comm,comm+sal,sal) from emp;

--nullif
select empno,ename,hiredate,nullif(hiredate,trunc(sysdate,'MONTH'))from emp;

--coalesce
select ename,sal,comm,coalesce(sal+comm,sal) from emp;

六、条件表达式 

--想显示全部雇员的职位,但是这些职位要求替换为中文显示:
--
--CLERK:办事员;
--SALESMAN:销售;
--MANAGER:经理;
--ANALYST:分析员;
--PRESIDENT:总裁;


--case表达式
select empno,ename,
case job
when 'CLERK' then '办事员'
when 'SALESMAN' then '销售'
when 'MANAGER' then '经理'
when 'ANALYST' then '分析员'
else '总裁'
end 
from emp;


--decode函数
select empno,ename,job,decode(job,'CLERK','办事员','SALESMAN','销售','MANAGER','经理','ANALYST','分析员','总裁')from emp;


--case表达式,区间值的判断
select empno,ename,sal,
case when sal<2000 then '低'
when sal<5000 then '中'
else '高'
end
from emp;

七、嵌套函数

--参照雇员信息表,想显示距聘用日期3个月后的下一个星期一的日期,且日期格式如:2017-01-06。

select empno,ename,to_char(next_day(add_months(hiredate,3),'星期一'),'YYYY-MM-DD') new_date 
from emp;


--参照雇员信息表,显示雇员日薪并四舍五入到2 位小数的结果,然后对薪资格式以‘¥ 1,182.19’这样的例子形式进行格式化

select empno,ename,sal,to_char(round(sal/30,2),'L9,999.99')
from emp;
发布了26 篇原创文章 · 获赞 27 · 访问量 5466

猜你喜欢

转载自blog.csdn.net/weixin_44337241/article/details/104643358