数据库之单行函数:字符函数,数字函数,日期函数,转换函数,通用函数,case表达式,decode函数
2014-09-15 00:01
621 查看
DUAL
是一个‘伪表’,可以用来测试函数和表达式
日期的数学运算
SELECT last_name, (SYSDATE-hire_date)/7AS WEEKS
FROM employees
WHERE department_id = 90;
函数对数字的转换
使用 TO_NUMBER
函数将字符转换成数字:
使用 TO_DATE
函数将字符转换成日期:
NVL (expr1, expr2)
NVL2 (expr1, expr2, expr3)
NULLIF (expr1, expr2)
COALESCE (expr1, expr2, ..., exprn)
----------------------------------------------------------------------
nvl2(a, b, c) 当a=null
返回c,否则返回b
SQL> select sal,sal*12+nvl2(comm, comm, 0)
年收入from emp;
nullif(a,b) 当a=b时,返回null;
否则返回a
select nullif('abc', 'abc')from dual;
coalesce(a, b, c, ...) ;从左到右,返回第一个不为空的....
SQL> select comm,sal,COALESCE(sal, comm) from emp;
General Functions
These functions work with any data type and pertain to the use ofnull values in the expression list.
语句中使用IF-THEN-ELSE
逻辑
使用两种方法:
CASE 表达式:SQL99的语法,类似Basic,比较繁琐
DECODE 函数:Oracle自己的语法,类似Java,比较简介
selectlower('Hello') 转小写, Upper('Hello')
转大写, initcap('hello world')
首字母大写 from dual;
select'aaa' || 'bbb' 连接1, concat('1111', 2222) from dual;
--substr(a, b)
从a中,第b位开始取
--substr(a, b, c)
从a中,第b位开始取,取5个字符
selectsubstr('abcdefg', 3) 第一次提取,
substr('abcdefg', 3,5) 第2次提取
fromdual;
--length字符数 --lengthb字节数
--一个中文字符,两个字节
selectlength('abcde中国') ,
lengthb('abcde') , lengthb('中国') from dual;
selectlpad('abcd', 10, '*' ), rpad('abcd', 10, '*' ) from dual;
SQL>select lpad('abcd', 10, '*' ) , rpad('abcd', 10, '*' ) from dual;
LPAD('ABCDRPAD('ABCD
--------------------
******abcdabcd******
------instr('母串', '子串')
,在母串中查找字串,返回子串在母串中的位置;找不到返回0;
selectinstr('abcd', 'cd' ) from dual;
--------trim
去掉前后指定的字符,字符可以是空格,也可以不是空格
.
--trim('H' from 'Hellowrold')
SQL>select trim('l' from 'Hellowrold') from dual;
TRIM('L'FR
----------
Hellowrold
SQL>select trim('H' from 'Hellowrold') from dual;
TRIM('H'F
---------
ellowrold
SQL>select trim('H' from 'HellowroldH') from dual;
-----replace('aaaa','b', 'c')
--从母串中检索符合条件的字串b,替换成c
SQL>select replace('hello world', 'l','*') from dual;
REPLACE('HE
-----------
he**o wor*d
--- 2保留小说点后2位
1保留小说点后1位
0保留小说点后个位
-1保留小说点十位(要看个位数,要看个位数,根据十位数,进行四舍五入)
-2保留百位(要看十位数,根据十位数,进行四舍五入)
select round(45.926, 2) AA, round(45.926,1) BB,
round(45.926, 0) CC, round(45.926) DD,
round(44.926, -1) EE, round(45.926, -2) FFfrom dual;
---round(45.926, -2) FF from dual
因为4没有超过5,所以四舍五入,0
=====日期函数
select sysdate-1
昨天, sysdate
今天, sysdate+1明天
from dual;
---to_char('日期/数字',format)
--
select to_char(sysdate-1, 'yyyy-mm-ddhh24:mi:ss')
昨天, to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
今天,
to_char(sysdate+1, 'yyyy-mm-dd hh24:mi:ss')明天
from dual;
---查询员工的入职时间,按照
天
周 月
年
方式显示
select ename, hiredate-sysdate
天,
(hiredate-sysdate)/7 周, (hiredate-sysdate)/30
月,
(hiredate-sysdate)/365
年 from emp;
--精确计算员工的入职月数
select ename, ( sysdate-hiredate)/30
月1,MONTHS_BETWEEN(sysdate,hiredate)
月2 from emp;
--显示当前日期的下一个周一
NEXT_DAY ('01-SEP-95','FRIDAY')
select next_day(sysdate, '星期一')
fromdual;
--日期的四舍五入
select round(sysdate, 'MONTH') from dual;
====================
================类型转换
=================================
---比这个日期都要大的08-9月
-81 所有员工信息
selct * from emp
where hiredate > '08-9月
-81' --隐式类型转换
selct * from emp
where hiredate > to_data('1981-02-02','yyyy-mm-dd')
--把字符串转成日期
select to_char(sysdate, 'yyyy-mm-dd') fromdual --把日期转成字符串
oracle自动转换
char===>number
number====>char
select3+2 || 'aaaa' from dual;
SQL>select 3+2 || 'aaaa' from dual;
3+2||
-----
5aaaa
SQL> \
data====>char
char====data
====转93行
--查询员工的薪水:两位小数
本地货币代码
千位符
selectename, to_char(sal, 'L9,999.99') from emp; -=-把数字转成字符串(格式化字符串)
--把这个字符串¥1,250.00转成数字
selectto_number('¥1,250.00' , 'L9,999.99') from dual;
ENAME TO_CHAR(SAL,'L9,999
-----------------------------
tom_abc ¥8,000.00
SMITH ¥800.00
ALLEN ¥1,600.00
WARD ¥1,250.00
JONES ¥2,975.00
MARTIN ¥1,250.00
BLAKE ¥2,850.00
CLARK ¥2,450.00
SCOTT ¥3,000.00
KING ¥5,000.00
TURNER ¥1,500.00
ADAMS ¥1,100.00
JAMES ¥950.00
FORD ¥3,000.00
MILLER ¥1,300.00
select sal, sal*12+nvl2(comm, comm, 0) 年收入 from emp;
通用函数============
nvl2(a,b, c) 当a=null
返回c,否则返回b
SQL>select sal, sal*12+nvl2(comm, comm, 0) 年收入 from emp;
nullif(a,b)当a=b时,返回null;
否则返回a
selectnullif('abc', 'abcd') from dual;
coalesce(a,b, c, ...) ;从左到右,返回第一个不为空的....
SQL>select comm,sal, COALESCE(sal, comm) from emp;
select nullif('abc', 'abc') AA,
nullif('abc', 'abcd') BB from dual;
=====CASE
表达式 =====做报表
-给员工涨工资:总裁
1000 经理:800
其他涨500,
前后工资给列出来
JOB
--------- -
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
检索JOB列
if 'PRESIDENT' SAL+1000
elseif 'MANAGER' SAL+800
else SAL+500
CASEexpr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
CASEjob WHEN 'PRESIDENT' THEN SAL+1000
WHEN 'MANAGER' THENSAL+800
ELSE SAL+500
END
select ename, job, sal
涨前工资,
(CASEjob WHEN 'PRESIDENT' THEN SAL+1000
WHEN'MANAGER' THEN SAL+800
ELSESAL+500
END)涨后工资
from emp
/
DECODE(job, 'PRESIDENT', SAL+1000 ,'MANAGER', SAL+800, SAL+500)
[, search2, result2,...,]
[, default])
select ename, job, sal
涨前工资,
(DECODE(job,'PRESIDENT', SAL+1000 , 'MANAGER', SAL+800, SAL+500)) 涨后工资
from emp
/
字符函数
字符函数 --substr(a, b) 从a中,第b位开始取 --substr(a, b, c) 从a中,第b位开始取,取5个字符 --length字符数 --lengthb字节数 --一个中文字符,两个字节 --instr('母串', '子串') ,在母串中查找字串,返回子串在母串中的位置;找不到返回0; -lpad rpad --lpad('abcd', 10, '*' ) rpad('abcd', 10, '*' ) --trim 去掉前后指定的字符,字符可以是空格,也可以不是空格 . --trim('H' from 'Hellowrold') --replace替换 SQL> select replace('hello world', 'l','*') from dual; |
是一个‘伪表’,可以用来测试函数和表达式
数字函数
l ROUND: 四舍五入 ROUND(45.926, 2) 45.93 l TRUNC: 截断 TRUNC(45.926, 2) 45.92 l MOD: 求余 MOD(1600, 300) 100 |
日期函数:
Oracle 中的日期型数据实际含有两个值: 日期和时间。 默认的日期格式是 DD-MON-RR. |
SELECT last_name, (SYSDATE-hire_date)/7AS WEEKS
FROM employees
WHERE department_id = 90;
转换函数
TO_CHAR函数对数字的转换
函数将字符转换成数字:
使用 TO_DATE
函数将字符转换成日期:
通用函数:
这些函数适用于任何数据类型,同时也适用于空值:NVL (expr1, expr2)
NVL2 (expr1, expr2, expr3)
NULLIF (expr1, expr2)
COALESCE (expr1, expr2, ..., exprn)
----------------------------------------------------------------------
nvl2(a, b, c) 当a=null
返回c,否则返回b
SQL> select sal,sal*12+nvl2(comm, comm, 0)
年收入from emp;
nullif(a,b) 当a=b时,返回null;
否则返回a
select nullif('abc', 'abc')from dual;
coalesce(a, b, c, ...) ;从左到右,返回第一个不为空的....
SQL> select comm,sal,COALESCE(sal, comm) from emp;
General Functions
These functions work with any data type and pertain to the use ofnull values in the expression list.
条件表达式
SQL语句中使用IF-THEN-ELSE
逻辑
使用两种方法:
CASE 表达式:SQL99的语法,类似Basic,比较繁琐
DECODE 函数:Oracle自己的语法,类似Java,比较简介
例子:
-字符函数selectlower('Hello') 转小写, Upper('Hello')
转大写, initcap('hello world')
首字母大写 from dual;
select'aaa' || 'bbb' 连接1, concat('1111', 2222) from dual;
--substr(a, b)
从a中,第b位开始取
--substr(a, b, c)
从a中,第b位开始取,取5个字符
selectsubstr('abcdefg', 3) 第一次提取,
substr('abcdefg', 3,5) 第2次提取
fromdual;
--length字符数 --lengthb字节数
--一个中文字符,两个字节
selectlength('abcde中国') ,
lengthb('abcde') , lengthb('中国') from dual;
selectlpad('abcd', 10, '*' ), rpad('abcd', 10, '*' ) from dual;
SQL>select lpad('abcd', 10, '*' ) , rpad('abcd', 10, '*' ) from dual;
LPAD('ABCDRPAD('ABCD
--------------------
******abcdabcd******
------instr('母串', '子串')
,在母串中查找字串,返回子串在母串中的位置;找不到返回0;
selectinstr('abcd', 'cd' ) from dual;
--------trim
去掉前后指定的字符,字符可以是空格,也可以不是空格
.
--trim('H' from 'Hellowrold')
SQL>select trim('l' from 'Hellowrold') from dual;
TRIM('L'FR
----------
Hellowrold
SQL>select trim('H' from 'Hellowrold') from dual;
TRIM('H'F
---------
ellowrold
SQL>select trim('H' from 'HellowroldH') from dual;
-----replace('aaaa','b', 'c')
--从母串中检索符合条件的字串b,替换成c
SQL>select replace('hello world', 'l','*') from dual;
REPLACE('HE
-----------
he**o wor*d
--- 2保留小说点后2位
1保留小说点后1位
0保留小说点后个位
-1保留小说点十位(要看个位数,要看个位数,根据十位数,进行四舍五入)
-2保留百位(要看十位数,根据十位数,进行四舍五入)
select round(45.926, 2) AA, round(45.926,1) BB,
round(45.926, 0) CC, round(45.926) DD,
round(44.926, -1) EE, round(45.926, -2) FFfrom dual;
---round(45.926, -2) FF from dual
因为4没有超过5,所以四舍五入,0
=====日期函数
select sysdate-1
昨天, sysdate
今天, sysdate+1明天
from dual;
---to_char('日期/数字',format)
--
select to_char(sysdate-1, 'yyyy-mm-ddhh24:mi:ss')
昨天, to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
今天,
to_char(sysdate+1, 'yyyy-mm-dd hh24:mi:ss')明天
from dual;
---查询员工的入职时间,按照
天
周 月
年
方式显示
select ename, hiredate-sysdate
天,
(hiredate-sysdate)/7 周, (hiredate-sysdate)/30
月,
(hiredate-sysdate)/365
年 from emp;
--精确计算员工的入职月数
select ename, ( sysdate-hiredate)/30
月1,MONTHS_BETWEEN(sysdate,hiredate)
月2 from emp;
--显示当前日期的下一个周一
NEXT_DAY ('01-SEP-95','FRIDAY')
select next_day(sysdate, '星期一')
fromdual;
--日期的四舍五入
select round(sysdate, 'MONTH') from dual;
====================
================类型转换
=================================
---比这个日期都要大的08-9月
-81 所有员工信息
selct * from emp
where hiredate > '08-9月
-81' --隐式类型转换
selct * from emp
where hiredate > to_data('1981-02-02','yyyy-mm-dd')
--把字符串转成日期
select to_char(sysdate, 'yyyy-mm-dd') fromdual --把日期转成字符串
oracle自动转换
char===>number
number====>char
select3+2 || 'aaaa' from dual;
SQL>select 3+2 || 'aaaa' from dual;
3+2||
-----
5aaaa
SQL> \
data====>char
char====data
====转93行
--查询员工的薪水:两位小数
本地货币代码
千位符
selectename, to_char(sal, 'L9,999.99') from emp; -=-把数字转成字符串(格式化字符串)
--把这个字符串¥1,250.00转成数字
selectto_number('¥1,250.00' , 'L9,999.99') from dual;
ENAME TO_CHAR(SAL,'L9,999
-----------------------------
tom_abc ¥8,000.00
SMITH ¥800.00
ALLEN ¥1,600.00
WARD ¥1,250.00
JONES ¥2,975.00
MARTIN ¥1,250.00
BLAKE ¥2,850.00
CLARK ¥2,450.00
SCOTT ¥3,000.00
KING ¥5,000.00
TURNER ¥1,500.00
ADAMS ¥1,100.00
JAMES ¥950.00
FORD ¥3,000.00
MILLER ¥1,300.00
select sal, sal*12+nvl2(comm, comm, 0) 年收入 from emp;
通用函数============
nvl2(a,b, c) 当a=null
返回c,否则返回b
SQL>select sal, sal*12+nvl2(comm, comm, 0) 年收入 from emp;
nullif(a,b)当a=b时,返回null;
否则返回a
selectnullif('abc', 'abcd') from dual;
coalesce(a,b, c, ...) ;从左到右,返回第一个不为空的....
SQL>select comm,sal, COALESCE(sal, comm) from emp;
select nullif('abc', 'abc') AA,
nullif('abc', 'abcd') BB from dual;
=====CASE
表达式 =====做报表
-给员工涨工资:总裁
1000 经理:800
其他涨500,
前后工资给列出来
JOB
--------- -
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
检索JOB列
if 'PRESIDENT' SAL+1000
elseif 'MANAGER' SAL+800
else SAL+500
CASEexpr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
CASEjob WHEN 'PRESIDENT' THEN SAL+1000
WHEN 'MANAGER' THENSAL+800
ELSE SAL+500
END
select ename, job, sal
涨前工资,
(CASEjob WHEN 'PRESIDENT' THEN SAL+1000
WHEN'MANAGER' THEN SAL+800
ELSESAL+500
END)涨后工资
from emp
/
DECODE(job, 'PRESIDENT', SAL+1000 ,'MANAGER', SAL+800, SAL+500)
[, search2, result2,...,]
[, default])
select ename, job, sal
涨前工资,
(DECODE(job,'PRESIDENT', SAL+1000 , 'MANAGER', SAL+800, SAL+500)) 涨后工资
from emp
/
相关文章推荐
- Oracle--单行函数(字符函数、数字函数、日期函数、转换函数、通用函数)
- oracle之分组函数、数字函数、字符函数、转换函数和日期函数
- 5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)
- 5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)
- orcal 中sql字符函数,数字函数,日期函数,转换函数学习,CASE和DECODE表达式学习
- orcale 单行函数之数字函数, 日期函数
- Oracle中 表空间,数字函数,日期函数,转换函数,同义词,反向键索引
- sql的基础语句-单行函数,dual,数字函数,日期函数,表连接,集合运算,分组报表,单行子查询,多行子查询
- VB 常用内部函数——计算函数,字符函数,转换函数,日期函数
- 字符函数、数字函数和日期函数
- Oracle中 表空间,数字函数,日期函数,转换函数,同义词,反向键索引
- 数据库——单行函数(日期函数,转换函数,通用函数)
- oracle数据库内置函数之数值函数、字符函数、日期函数、转换函数及其在查询语句中的运用
- javaScript parseInt字符转化为数字函数使用小结
- oracle 常用字符函数 数字函数
- oracle 数值型函数,字符型函数,日期函数,转换函数,to_char,自动类型转换,日期类型转换
- 初学JS作业二:试用js声明一个字符str、声明一个数字num、声明一个布尔值isHave、声明一个数组arr、声明一个函数fn!
- Oracle的学习三:java连接Oracle、事务、内置函数、日期函数、转换函数、系统函数
- tsql 用户函数- 从字符串中提取需要的字符(中文,数字,字母等)
- ORACLE 常用函数-字符函数(可用于字面字符或数据库列)