oracle--单行函数

xiaoxiao2021-02-27  303

单行函数

SQL函数:

两种sql函数

单行函数

操作数据对象接受参数返回一个结果只对一行进行变换每行返回一个结果可以转换数据类型可以嵌套参数可以是一列或一个值

一、字符函数

大小写控制函数:改变字符的大小写

--字符函数 select lower('Hello World') 转小写,upper('Hello World') 转大写,initcap('hello world') 首字母大写 from dual; --substr(a,b) 从a中,第b位开始取 select substr('Hello World',3) 子串 from dual; 子串 --------- llo World --substr(a,b,c) 从a中,第b位开始取,取c位 select substr('Hello World',3,4) 子串 from dual; 子串 ---- llo --instr(a,b) 在a字符串中查找b,找到了,返回下标(从1开始),没有找到,返回0 select instr('Hello World','ll') 位置 from dual; 位置 ---------- 3 --length 字符数 lengthb 字节数 英文: select length('Hello World') 字符,lengthb('Hello World') 字节 from dual; 字符 字节 ---------- ---------- 11 11 中文: select length('北京') 字符,lengthb('北京') 字节 from dual 字符 字节 ---------- ---------- 2 4 --lpad 左填充 rpad 右填充 -- abcd ---> 10 位 select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右 from dual; 第一个参数:对谁进行填充 第二个参数:填到多少位 第三个参数:填什么 左 右 ---------- ---------- ******abcd abcd****** --trim 去掉前后指定的字符 select trim('H' from 'Hello WorldH') from dual; TRIM('H'FR ---------- ello World --replace select replace('Hello World','l','*') from dual; REPLACE('HE ----------- He**o Wor*d
二、数字函数:
round:四舍五入(第二个参数表示保留两位小数) round(45.926,2)--->45.93 trunc:截断 trunc(45.926,2)--->45.92 mod:求余 mod(1600,300)--->100 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 --截断 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
三、日期:

Oracle中的日期型数据(date)实际含有两个值:日期和时间

默认的日期格式是:DD-MON-RR

--查询当前时间 SQL> select sysdate from dual; SYSDATE --------- 04-MAY-17 to_char():把某个东西,按照某个格式转换成字符串 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2017-05-04 09:19:58

日期的数学运算:

在日期上加上或减去一个数字结果仍为日期两个日期相减返回日期之间相差的天数可以用数字除24来向日期中加上或减去小时

例如:

--昨天 今天 明天 SQL> select (sysdate-1) 昨天,sysdate 今天,(sysdate+1) 明天 from dual; 昨天 今天 明天 -------------- -------------- -------------- 21-11月-15 22-11月-15 23-11月-15 --计算员工的工龄:天 星期 月 年 SQL> select ename,hiredate, (sysdate-hiredate) 天,(sysdate-hiredate)/7 星期, 2 (sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年 3 from emp; ENAME HIREDATE 天 星期 月 年 ---------- -------------- ---------- ---------- ---------- ---------- SMITH 17-12月-80 12758.6314 1822.66163 425.287713 34.9551545 ALLEN 20-2月 -81 12693.6314 1813.37591 423.121046 34.7770723 WARD 22-2月 -81 12691.6314 1813.0902 423.05438 34.7715928 JONES 02-4月 -81 12652.6314 1807.51877 421.75438 34.6647435 MARTIN 28-9月 -81 12473.6314 1781.94734 415.787713 34.1743326 BLAKE 01-5月 -81 12623.6314 1803.37591 420.787713 34.5852915 CLARK 09-6月 -81 12584.6314 1797.80448 419.487713 34.4784422 SCOTT 19-4月 -87 10444.6314 1492.0902 348.15438 28.6154285 KING 17-11月-81 12423.6314 1774.80448 414.121046 34.0373463 TURNER 08-9月 -81 12493.6314 1784.80448 416.45438 34.2291271 ADAMS 23-5月 -87 10410.6314 1487.23306 347.021046 28.5222778 ENAME HIREDATE 天 星期 月 年 ---------- -------------- ---------- ---------- ---------- ---------- JAMES 03-12月-81 12407.6314 1772.51877 413.587713 33.9935107 FORD 03-12月-81 12407.6314 1772.51877 413.587713 33.9935107 MILLER 23-1月 -82 12356.6314 1765.23306 411.887713 33.8537846

日期函数:

moths_between: select ename,hiredate,(sysdate-hiredate)/30 一,months_between(sysdate,hiredate) 二 from emp; ENAME HIREDATE 一 二 ---------- -------------- ---------- ---------- SMITH 17-12月-80 425.287784 419.181726 ALLEN 20-2月 -81 423.121117 417.084952 WARD 22-2月 -81 423.054451 417 JONES 02-4月 -81 421.754451 415.665597 MARTIN 28-9月 -81 415.787784 409.826888 BLAKE 01-5月 -81 420.787784 414.697855 CLARK 09-6月 -81 419.487784 413.439791 SCOTT 19-4月 -87 348.154451 343.11721 KING 17-11月-81 414.121117 408.181726 TURNER 08-9月 -81 416.454451 410.472049 ADAMS 23-5月 -87 347.021117 341.988178 ENAME HIREDATE 一 二 ---------- -------------- ---------- ---------- JAMES 03-12月-81 413.587784 407.633339 FORD 03-12月-81 413.587784 407.633339 MILLER 23-1月 -82 411.887784 405.988178 --56 个月后 SQL> select add_months(sysdate,56) from dual; ADD_MONTHS(SYS -------------- 22-7月 -20 select last_day(sysdate) from dual; LAST_DAY(SYSDA -------------- 30-11月-15 --next_day SQL> --下一个星期日 SQL> select next_day(sysdate,'星期日') from dual; NEXT_DAY(SYSDA -------------- 29-11月-15 SQL> --下一个星期一 SQL> select next_day(sysdate,'星期一') from dual; NEXT_DAY(SYSDA -------------- 23-11月-15

next_day的应用:

每个星期一自动备份数据 1. 分布式数据库 2. 快照 触发器

日期函数:

select round(sysdate,'month'),round(sysdate,'year') from dual; ROUND(SYSDATE, ROUND(SYSDATE, -------------- -------------- 01-12月-15 01-1月 -16

转换函数:

数据类型转换: 隐式 显示

隐式数据类型转换:(oracle自动完成)

select * from emp where hiredate='17-11月-81'; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- -------- --------- ---------- -------------- ----- ---------- ---------- 7839 KING PRESIDENT 17-11月-81 5000 10

显示数据类型转换:

to_char函数对日期的转换:

to_char(date,'format_model') 格式: 必须包含在单引号中而且大小写敏感 可以包含任意的有效的日期格式 日期之间用逗号隔开

日期格式的元素:

--2015-11-22 15:32:12今天是星期日 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual; TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI ---------------------------------- 2015-11-22 15:33:55今天是星期日

to_char函数对数字的转换:

to_char函数中经常使用的几种格式

--查询员工薪水:两位小数 千位符 货币代码 select to_char(sal,'L9,999.99') from emp; TO_CHAR(SAL,'L9,999 ------------------- ¥800.00 ¥1,600.00 ¥1,250.00 ¥2,975.00 ¥1,250.00 ¥2,850.00 ¥2,450.00 ¥3,000.00 ¥5,000.00 ¥1,500.00 ¥1,100.00 TO_CHAR(SAL,'L9,999 ------------------- ¥950.00 ¥3,000.00 ¥1,300.00

通用函数: 这些函数适用于任何数据类型,同时也适用于空值

nvl(expr1,expr2) nvl(expr1,expr2,expr3) nullif(expr1,expr2) coalesce(expr1,expr2,...,exprn) --nvl2(a,b,c) 当a=null的时候,返回c;否则返回b select sal*12+nvl2(comm,comm,0) from emp; --nullif(a,b) 当a=b的时候,返回null;否则返回a select nullif('abc','abc') 值 from dual; 值 --- select nullif('abc','abcd') 值 from dual; 值 --- abc

–coalesce 从左到右找到第一个不为null的值 select comm,sal,coalesce(comm,sal) “第一个不为null的值” from emp;

COMM SAL 第一个不为null的值
800 800 300 1600 300 500 1250 500 2975 2975 1400 1250 1400 2850 2850 2450 2450 3000 3000 5000 5000 0 1500 0 1100 1100 COMM SAL 第一个不为null的值
950 950 3000 3000 1300 1300

条件表达式:

在sql语句中使用if-then-else逻辑 使用两种方法: 1、case表达式:sql99的语法,类似basic,比较繁琐 2、decode函数:Oracle自己的语法,类似java,比较简洁

语法:

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 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; 或者: case when sal<3000 then **** when sal>=3000 and sal<6000 then **** else **** end

decode:

decode(col|expression,search1,result1 [,search2,result2,...,] [,default]) SQL> select ename,job,sal 涨前, 2 decode(job,'PRESIDENT',sal+1000, 3 'MANAGER',sal+800, 4 sal+400) 涨后 5 from emp;
转载请注明原文地址: https://www.6miu.com/read-3286.html

最新回复(0)