您的位置:首页 > 数据库

数据库之单行函数:字符函数,数字函数,日期函数,转换函数,通用函数,case表达式,decode函数

2014-09-15 00:01 621 查看


字符函数



字符函数

--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;

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_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.

条件表达式

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

/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐