– 字符函数
大小写转换函数:lower() upper() initcap()
-- lower() 将所有字母转小写 select lower(ename) from emp; select ename from emp where lower(ename) like '%s%'; -- 虚表 dual(可以拿来显示一些表中不存在的数据,一般用于测试用表) select lower('KJLAF') from dual; -- upper() 将所有字母转大写 select upper('lkajf') from dual; -- initcap() 将每个单词首字母大写 select initcap('hello world') from dual;
字符处理函数:count() substr() length() instr() lpad() rpad() trim() replace()
-- concat(参数一,参数二) 拼接函数 -- 注意:concat拼接函数只能拼接两层,还要加拼接字符的话需要再嵌套一层concat函数 select concat(concat(ename,'的职位是'), job) from emp; -- substr(参数一,n1,[n2]) 截取函数 select substr('KJLAF', 2) from dual; -- 返回第一个参数中,从第n1位开始,长度为n2的子串。 -- 如果n2省略,取第n1位开始的所有字符。 -- 如果n1是负值,表示从第一个参数的后面第abs(n1)位开始向右取长度为n2的子串。 -- length(参数) 获取字符串的长度 -- 注意:length函数取中文时长度是字数的两倍!!! select length('KJLAF') from dual; -- instr(s1,s2,[n1],[n2]) 获取指定字符的索引 --参数一:待获取索引位置的字符 --参数二:需获取索引位置的字符 --参数三:开始查找的位置 --参数四:指定字符第N次出现的位置 -- 返回s1中,子串s2从n1开始,第n2次出现的位置。n1,n2默认值为1 select instr('KJLAF','J') from dual; select * from emp where 0 < instr(ename, 'A'); -- lpad(参数一,参数二,参数三) 左填充 -- 参数一:要被填充的字符或表达式、列名 -- 参数二:定义填充的字符总长度 -- 参数三:定义在左边填充的字符 select lpad(lpad(empno,10,0),11,'C') from emp; select concat('C',lpad(empno,10,0)) from emp; select 'C' || lpad(empno,10,0) from emp; -- rpad(参数一,参数二,参数三) 右填充(与上类似) select rpad(rpad(empno,10,0),11,'C') from emp; select concat(rpad(empno,10,0),'C') from emp; select rpad(empno,10,0) || 'C' from emp; -- trim() 去除首尾字符,默认去除空格 select trim(leading 's' from 'sskjh dfs') from dual; select trim(trailing 's' from 'sskjh dfs') from dual; select trim(both 's' from 'sskjh dfs') from dual; select trim('s' from 'sskjh dfs') from dual; -- replace(s1,s2,s3) 把s1中的s2用s3代替 select replace('beijing', 'bei', 'nan') from dual;
数值函数:round() trunc() mod()
-- round(参数,n) 四舍五入,取小数点后第n位 select round(45.654, 1) from dual;--45.7 n>0 select round(45.654, 0) from dual;--46 n=0 select round(45.654, -1) from dual;--50 n<0 -- trunc(参数,n) 截断,截取小数点后第n位 select trunc(45.654, 1) from dual;--45.6 n>0 select trunc(45.654, 0) from dual;--45 n=0 select trunc(45.654, -1) from dual;--40 n<0 -- mod(除数,被除数) 取余 select mod(9, 2) from dual;
日期处理
Oracle是以一种内部的数值形式存储日期的,即:世纪、年、月、日、小时、分、秒 默认的日期形式是: DD-MON-RR
日期型函数:sysdate months_between() add_months() next_day() last_day() round() trunc() extract()
-- sysdate 获取当前系统时间 select sysdate from dual; -- 1.查询每个员工截止到现在一共入职多少天? select (sysdate - hiredate) 入职天数 from emp; -- months_between(减数日期,被减数日期) 返回两个年份之间相隔的月数 select months_between(sysdate, hiredate) from emp; select months_between('31-12月-18','31-10月-18') from dual; -- add_months(日期,加的月数) 加月份 select add_months(hiredate, 6) 转正日期 from emp; -- next_day(日期,'星期几') 返回指定日期的下一个指定日期 select next_day(sysdate, '星期一') from dual; -- last_day(日期) 返回当前月份的最后一天 select last_day(sysdate) from dual; -- round(日期,'参数') -- 年份按1-6月和7-12月四舍五入到最近的 几几年1月 -- 月份按1-15日和16-30日四舍五入到最近的 几月1日 -- 天数按周一至周三 和 周四至周日四舍五入到最近的 周日 select round(sysdate, 'month'), round(sysdate, 'day') from dual; -- 以'day'作为参数,取以星期一到三,星期四到日四舍五入 -- trunc(日期,'参数') -- 年份按1-6月和7-12月四截取到当年的1月1日 -- 月份按1-15日和16-30日截取到当月的1日 -- 天数按周一至周三 和 周四至周日四截取到上一个周日 select trunc(sysdate, 'month'), trunc(sysdate, 'day') from dual; -- extract(年、月、日 from 日期) 提取指定日期年月日 select extract(year from sysdate) 年, extract(month from sysdate) 月, extract(day from sysdate) 日 from dual;
– 转换函数
隐式数据转换
select '1234'+100 from dual; 1.对于INSERT和UPDATE操作,oracle会把插入值或者更新值隐式转换为字段的数据类型 2.对于SELECT语句,oracle会把字段的数据类型隐式转换为变量的数据类型 3.当比较一个字符型和数值型的值时,oracle会把字符型的值隐式转换为数值型 4.当比较字符型和日期型的数据时,oracle会把字符型转换为日期型 5.用连接操作符(||)时,oracle会把非字符类型的数据转换为字符类型 6.如果字符类型的数据和非字符类型的数据(如number、date、rowid等)作算术运算, 则oracle会将字符类型的数据转换为合适的数据类型, 这些数据类型可能是number、date、rowid等
显示数据转换:to_char() to_date() to_number()
– to_char 字符转换
- 转日期
用时间元素格式化日期的时间部分hh24:mi:ss am
- hh表示时间,24表示24小时制,因此12则是12小时制;
- mi表示分钟
- ss表示秒
am用于显示当前时间是上午还是下午
select to_char(sysdate) from dual;-- 默认 select to_char(sysdate, 'YYYY"年"MM"月"DD"日" HH24:MI:SS') from dual;-- 2018年07月25日 11:06:02 select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual;-- 2018-07-25 11:07:26 select to_char(sysdate, 'YYYY/MM/DD HH24:MI:SS') from dual;-- 2018/07/25 11:07:39
转数值
注意:进行数字类型到字符型转换时,格式中的宽度一定要超过实际列宽度,否则会显示为###
select to_char(30000.45, ‘L99,999.9’) from dual;– ¥30,000.5,四舍五入
– to_number 数值转换
注意:要转换的char类型数据必须是由数字组成的字符串,格式码中相应的格式必须要和char中的格式匹配select to_number('1234')+100 from dual;
– to_date 日期转换
注意:要转换的char类型数据必须是可以转换成日期的字符,格式码的格式必须要和char中的格式匹配select to_date('2018年7月25日', 'yyyy"年"mm"月"dd"日"') from dual;
– 通用函数:nvl() nvl2() nullif() coalesce() case decode
与空值(NULL)相关的
-- nvl(参数一,参数二) 参数一为空,返回参数二,否则返回参数一 select nvl(comm,0) from emp; -- nvl2(参数一,参数二,参数三) 参数一为空,返回参数三,否则返回参数二 select nvl2(comm, comm, 0) from emp; -- nullif(参数一,参数二) 参数一等于参数二,返回NULL,否则返回参数一 select nullif(10,23) from dual; select nullif(10,10) from dual; -- coalesce(参数一,参数二,... ,参数n) 返回第一个不为空的参数 select coalesce(null,null,3) from dual;
条件处理函数(case, decode)
-- case -- case语法: CASE expr WHEN comparison_expr1 THEN return_expr1 [WHEN comparison_expr2 THEN return_expr2 WHEN comparison_exprn THEN return_exprn ELSE else_expr] END !!注意:case的判断条件可以写在case后面统一做判断名,也可放在when 后面逐一判断 eg: select deptno, case when deptno=10 then '部门一' when deptno=20 then '部门二' else '部门三' end from emp; -- decode -- decode语法: DECODE(字段|表达式, 条件1,结果1[,条件2,结果2…,][,缺省值]) eg: select deptno, decode(deptno, 10, '部门一', 20, '部门二') from emp;
–函数嵌套(单行函数可以嵌套任意多层)
嵌套的函数是从最里层向最外层的顺序计算的
select ename, concat(ename,nvl(to_char(mgr), 'No Manager'))
from emp where mgr is null;--KING