单行函数
SQL> --字符函数
SQL> --select lower('Hello World') 小写,upper('Hello World') 大写,initcap('hello world') 首字母大写
2 from dual;
SQL> --substr(a,b) 从a中,第b位开始取 substr(a,b,c) 直到第c位 b从1开始 b,c超出范围不报错
SQL> select substr('hello',3) from dual;
SUB
---
llo
SQL> select substr('hello',3,9) from dual;
SUB
---
llo
SQL> --instr(‘ ‘,’ ‘) 计数从一开始
SQL> select instr('hello','lo') from dual;
INSTR('HELLO','LO')
-------------------
4
SQL> --length 字符数 lengthb 字节数
SQL> select length('Hello World') 字符,lengthb('Hello World') 字节
2 from dual;
字符 字节
---------- ----------
11 11
SQL> select length('北京') 字符,lengthb('北京') 字节
2* from dual
字符 字节
---------- ----------
2 4
SQL> --lpad 左填充 rpad右填充
SQL> -- abcd ---> 10位
SQL> select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右
2 from dual;
左 右
---------- ----------
******abcd abcd******
SQL> select trim('H' from 'HelHloH') from dual;
TRIM
-----
elHlo
SQL>select replace('Hello World','l','*') from dual;
SQL> --四舍五入 round(a)=round(a,0)
SQL> select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,
2 round(45.926,-1) 四,round(45.926,-2) 五
3 from dual;
一 二 三 四 五
---------- ---------- ---------- ---------- ----------
45.93 45.9 46 50 0
SQL> --截断
SQL> ed
已写入 file afiedt.buf
1 select trunc(45.926,2) 一,trunc(45.926,1) 二,trunc(45.926,0) 三,
2 trunc(45.926,-1) 四,trunc(45.926,-2) 五
3* from dual
SQL> /
一 二 三 四 五
---------- ---------- ---------- ---------- ----------
45.92 45.9 45 40 0
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2018-08-26 18:02:55
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI
----------------------------------
2018-08-26 18:17:44今天是星期日
SQL> --昨天 今天 明天
SQL> select (sysdate-1) 昨天,sysdate 今天,(sysdate+1) 明天 from dual;
昨天 今天 明天
-------------- -------------- --------------
09-3月 -15 10-3月 -15 11-3月 -15
SQL> --months_between
SQL> select ename,hiredate,(sysdate-hiredate)/30 一,months_between(sysdate,hiredate) 二
2 from emp;
ENAME HIREDATE 一 二
---------- -------------- ---------- ----------
SMITH 17-12月-80 416.720919 410.794437
ALLEN 20-2月 -81 414.554252 408.697663
WARD 22-2月 -81 414.487585 408.633147
SQL> --78个月后-
SQL> --add_months
SQL> select add_months(sysdate,78) from dual;
ADD_MONTHS(SYS
--------------
10-9月 -21
SQL> --last_day 月的最后一天
SQL> select last_day(sysdate) from dual;
SQL> --下一个星期二 格式需遵循 ’周二‘ ’礼拜二‘都错误
SQL> select next_day(sysdate,'星期二') from dual;
next_day的应用:每个星期一自动备份数据
1. 分布式数据库
2. 快照
SQL> --对日期四舍五入
SQL> select round(sysdate,'month'),round(sysdate,'year') from dual;
ROUND(SYSD ROUND(SYSD
---------- ----------
2018-09-01 2019-01-01
通用函数
SQL> -- 通用函数
SQL> --nvl(a,b) 当a=null时候,返回b,否则返回a自身
SQL>select nvl(comm,0) 奖金 from emp;
SQL> --nvl2(a,b,c) 当a=null时候,返回c,否则返回b
SQL> select sal*12+nvl2(comm,comm,0) from emp;
SQL> --nullif(a,b) 当a=b时候,返回null,否则返回a
SQL> select nullif('abc','abc') 值 from dual;
值
---
SQL> select nullif('abc','abcd') 值 from dual;
值
---
abc
SQL> --coalesce 从左到右找到第一个不为null的值
SQL> select comm,sal,coalesce(comm,sal) "第一个不为null的值"
2 from emp;
COMM SAL 第一个不为null的值
---------- ---------- ------------------
800 800
300 1600 300
500 1250 500
2975 2975
1400 1250 1400
2850 2850
SQL> select ename,job,sal 涨前,
2 case job when 'PRESIDENT' then sal+1000
3 when 'MANAGER' then sal+800
4 else sal+400
5 end 涨后
6 from emp;
ENAME JOB 涨前 涨后
---------- --------- ---------- ----------
SMITH CLERK 800 1200
ALLEN SALESMAN 1600 2000
WARD SALESMAN 1250 1650
JONES MANAGER 2975 3775
SQL> select ename,job,sal 涨前,
2 decode(job,'PRESIDENT',sal+1000,
3 'MANAGER',sal+800,
4 sal+400) 涨后
5 from emp;