字符串函数可以针对于字符串数据进行处理,在Oracle之中对于此类函数定义有如下几种:UPPER()、LOWER()、INITCAP()、REPLACE()、LENGTH()、SUBSTR()
大小写转换函数
· 转大写函数:字符串 UPPER (列 | 字符串)
· 转小写函数:字符串 LOWER (列 | 字符串)
首字母大写;
· 语法:字符串 INITCAP (列 | 数据)
计算字符串长度
· 语法:数字 LENGTH (列 | 字符串数据)
字符串替换,可以使用指定的内容替换掉原始字符串中的数据。
· 语法:字符串 REPLACE (列 | 数据,要查找内容,新的内容)
字符串截取
· 语法一:字符串 SUBSTR(列 | 数据,开始点),从指定的开始点一直截取到结尾;
· 语法二:字符串 SUBSTR(列 | 数据,开始点,长度):截取指定范围的子字符串。
实际上对于日期时间提供有以下三种计算模式:
· 日期 + 数字 = 日期(若干天之后的日期);
· 日期 - 数字 = 日期(若干之前的日期)
· 日期 - 日期 = 数字(两个日期间的天数)
· 语法:数字 MONTHS_BETWEEN(日期1,日期2)
转换函数一共提供有三种:TO_CHAR()、TO_DATE()、TO_NUMBER()
转字符串函数,数字或者是日期可以转换为字符串。
· 语法:字符串 TO_CHAR(列 | 日期 | 数字,转换格式)。
· 对于转换格式而言主要有两类格式:
|- 日期转换为字符串:年(yyyy)、月(mm)、日(dd)、时(hh、hh24)、分(mi)、秒(ss);
|- 数字转换为字符串:任意的一位数字(9)、货币(L,本地货币)。
1、转小写和大写
select lower('Hello') 转小写,upper('Hello') 转大写 from dual;
2、用户输入,输入操作
select * from emp where ename=upper('&inputname');
3、首字母大写,其余的都小写
select initcap('hElloWorld') from dual;
4、将每一个雇员的姓名首字母大写
select initcap(ename) from emp;
5、查询出每个雇员姓名以及雇员姓名的长度
select ename,length(ename) 长度 from emp;
6、查询雇员姓名长度为5的全部雇员信息
select ename from emp where length(ename)=5;
7、将所有雇员姓名之中的字母A替换为“_”
select replace(ename,upper('a'), '_') from emp;
8、消除空格数据
select replace('hello world nihao ma ','','') from dual;
9、字符串截取操作, 从指定位置截取到结尾
select substr('helloworldnihao',11)from dual;输出nihao
截取部分内容select substr('helloworldnihao',6,5) from dual;输出 world
10、要求截取每一位雇员姓名的前三位字符
select ename ,substr(ename,1,3) from emp;
截取每个姓名的后三个字母
select ename,substr(ename,length(ename)-2) from emp;
select ename,substr(ename,-3) from emp;
11、四舍五入
select
round (78915.67823823) , 78916,小数点之后的内容直接进行四舍五入
round (78915.67823823,2) , 78915.68,保留两位小数
round (78915.67823823,-2) , 78900,把不足5的数据取消了
round (78985.67823823,-2) , 79000,如果超过了5则进行进位
round(-15.65) -16
from dual ;
截取小数,所有的小数都不进位
select
trunc(78915.67823823) , 78915
trunc (78915.67823823,2) , 78915.67
trunc (78915.67823823,-2) , 78900
trunc (78985.67823823,-2) , 78900
trunc (-15.65) -15
from dual ;
求模(求余数)
select mod(10,3)from dual;
12、测试若干天之后的日期
select sysdate+10 十天后的日期,sysdate+100 一百天后的日期 from dual;
13、计算每一位雇员到今天为止的雇佣天数
select ename,hiredate,sysdate-hiredate from emp;
14、计算每一位雇员到今天位置的雇佣总月数
select ename,hiredate,months_between(sysdate,hiredate) 月数 from emp;
15、计算每一位雇员到今天所雇佣的年限
select ename,hiredate,trunc(months_between(sysdate,hiredate)/12)years from emp;
15、增加若干月之后的日期:
· 语法:日期 ADD_MONTHS(日期,月数)
select add_months(sysdate,2),add_months(sysdate,12) from dual;
16、计算所有还差1年满35年雇佣日期的全部雇员。(34年)
select * from emp where trunc(months_between(sysdate,hiredate)/12)=34;
17、计算指定日期所在月的最后一天;
· 语法:日期 LAST_DAY(日期)
select last_day(sysdate) from dual;
18、查询出所有在雇佣所在月倒数第二天被雇佣的雇员信息
select ename,hiredate,last_day(hiredate),last_day(hiredate)-2 from emp
where last_day(hiredate)-2=hiredate;
19、计算下一个指定的星期:
· 语法:日期 next_day(日期,一周时间数)
select next_day(sysdate,'星期二') from dual;
20、第一步:计算出年
如果要计算年肯定是按照月来计算是最准确的,那么一定要使用MONTHS_BETWEEN()函数进行月的计算,而后除以12就是年。
select ename,hiredate,
trunc(months_between(sysdate,hiredate)/12)年
from emp;
21、计算月
在进行年计算的时候就包含有余数,余数实际上就是除12的结果,所以就是月数。利用MOD()函数求出余数。
select ename,hiredate,
trunc(months_between(sysdate,hiredate)/12)年,
trunc(mod(months_between(sysdate,hiredate),12))月
from emp;
22、计算天数:天
现在为止所知道的计算天数的操作只有一个公式:“日期1 - 日期2 = 数字(天数)”,于是现在的问题就集中在了日期的内容上:
· 日期1:一定是当前日期,肯定使用SYSDATE伪列;
· 日期2,实际上已经可以利用MONTHS_BETWEEN()函数求出两个日期之间的月数。
select empno,ename,hiredate,
trunc(months_between(sysdate,hiredate)/12)年,
trunc(mod(months_between(sysdate,hiredate),12))月,
trunc(sysdate-add_months(hiredate,months_between(sysdate,hiredate)))天
from emp;
转换函数一共提供有三种:TO_CHAR()、TO_DATE()、TO_NUMBER()
转字符串函数,数字或者是日期可以转换为字符串。
· 语法:字符串 TO_CHAR(列 | 日期 | 数字,转换格式)。
· 对于转换格式而言主要有两类格式:
|- 日期转换为字符串:年(yyyy)、月(mm)、日(dd)、时(hh、hh24)、分(mi)、秒(ss);
|- 数字转换为字符串:任意的一位数字(9)、货币(L,本地货币)。
23、格式化日期
select to_char(sysdate,'yyyy-mm-dd'),to_char(sysdate,'hh:mi:ss') from dual;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
24、查询出每个雇员的编号、姓名、雇佣年份
select empno,ename,to_char(hiredate,'yyyy')年 from emp;
25、查询出所有在2月雇佣的雇员信息
select * from emp where to_char(hiredate,'mm')=2;
select * from emp where to_char(hiredate,'mm')='02';
Oracle中实际上提供有数据类型的自动转换,如果发现比较的类型不统一,在一定的范围内它是可以转换的。
TO_CHAR()函数除了可以进行日期的转换之外,也支持数字转换。所谓的数字转换往往是针对于数字的可读性进行一些格式化的操作。
26、转换数字
select to_char(34535636376,'L999,999,999,999') from dual;
转日期函数:
如果说现在某一个字符串按照“'日-月-年'”的方式编写,那么可以自动转换为日期类型,但是也可以将指定格式的字符串转换为日期类型,这个可以依靠TO_DATE()函数完成,这个函数:
· 语法:TO_DATE(字符串,转换格式);
|- 年(yyyy)、月(mm)、日(dd)、时(hh、hh24)、分(mi)、秒(ss);
27、实现字符串转换为日期
select to_date('1991-10-01','yyyy-mm-dd') from dual;
转数字函数。
可以将字符串(由数字所组成)变为数字,语法:数字 TO_NUMBER(字符串)
select to_number('9') * to_number('9') from dual;
28、处理null
select ename,empno,job,sal,comm,(sal+comm)*12 from emp;
select ename,empno,job,sal,comm,nvl(comm,0),(sal+nvl(comm,0))*12 from emp;
29、多数值判断
语法:DECODE(列,匹配内容1,显示内容1,匹配内容2,显示内容2,...[,默认值])
所谓的多数值判断,指的是根据不同的结果可以在输出的时候进行一个数据的转换,假设,现在每一位雇员都有自己的职位,那么现在职位使用的是英文描述,决定将其更换为中文。
select empno,ename,job,decode
(job,'CLERK','办事员','SALESMAN','销售','MANAGER',
'经理','ANALYST','分析','PRESIDENT','总裁','暂无此信息')
from emp;