您的位置:首页 > 数据库 > Oracle

Oracle基本函数的应用

2014-11-12 17:36 337 查看
oracle中的函数

这些函数可以用在select where having order by这些关键词后,

起着对某个常量或者某列数据进行相应的转化后在进行使用

例如

select ename,sal,round(sal,-2) from emp where round(sal,-2)>=3000;

通过使用这些函数,可以帮助我们实现满足一些特殊要求的查询数学函数

数学函数

round:使用格式为 round(n[,m])其中[] 中的内容可以省略

select round(123.456),round(123.456,1),round(123.456,2),round(123.456,-1) from dual;

结果为

ROUND(123.456) ROUND(123.456,1) ROUND(123.456,2) ROUND(123.456,-1)

-------------- ---------------- ---------------- -----------------

123 123.5 123.46 120

后面的参数指定了返回值的精度,或者说是从小数点第几位开始四舍五入,

如果不带后面的参数,则默认为四舍五入取整数,该例子中采用的是常量,

from后用的是dual,在上一篇文章中介绍了dual这个表,这个表只有一行数据,

上面的sql只有一行需要返回,返回的内容由select关键字决定,在实际应用中,参数可以是一个列名,例如

select round(sal,-2) ,ename from emp;

ceil:使用格式 ceil(n)

select ceil(10.9),ceil(10.123) from dual;

结果为

CEIL(10.9) CEIL(10.123)

---------- ------------

11 11

ceil函数的作用是将n的小数部分舍掉,整数部分加1

floor:格式floor(n)

select floor(10.9),floor(10.123) from dual;

结果为

FLOOR(10.9) FLOOR(10.123)

----------- -------------

10 10

与ceil不同的是该函数是将n的小数部分舍掉,整数部分不变。

在英文中ceil是天花板的意思,floor是地板的意思,

在oracle的函数中,ceil是"向上"取整数,而floor是"向下"取整数,这应该跟英文意思多少有点关系吧

abs:格式abs(n)

select abs(-1),abs(0),abs(1) from dual;

结果为

ABS(-1) ABS(0) ABS(1)

---------- ---------- ----------

1 0 1

abs函数的作用是取得n的绝对值

sign:格式 sign(n)

select sign(0),sign(100),sign(-100) from dual;

结果是

SIGN(0) SIGN(100) SIGN(-100)

---------- ---------- ----------

0 1 -1

sign函数的规则是n≥0,sign(n)=1;
当n<0, sign(n)=-1

sqrt:格式sqrt(n)

select sqrt(4),sqrt(9.9) from dual;

结果是

SQRT(4) SQRT(9.9)

---------- ----------

2 3.14642654

sqrt的作用是取得n的平方根

exp:格式exp(n)

select exp(0) ,exp(1) from dual;

结果是

EXP(0) EXP(1)

---------- ----------

1 2.71828183

exp函数的作用是求e的n次幂的值

ln和log:格式ln(n) log(m,n)

select ln(1),log(10,100) from dual;

结果是

LN(1) LOG(10,100)

---------- -----------

0 2

这两个函数中ln为自然对数,log(m,n)是以m为底求n的对数

power:格式 power(m,n)

select power(3,2),power(3,3) from dual;

结果是

POWER(3,2) POWER(3,3)

---------- ----------

9 27

该函数的作用是求m的n次幂

mod:格式mod(m,n)

select mod(10,6),mod(1,2) from dual;

结果是

MOD(10,6) MOD(1,2)

---------- ----------

4 1

该函数的作用是m/n的余数

出了上面的函数oracle还提供了sin(n) cos(n) tan(n)

asin(n) acos(n) atan(n)

sinh cosh tanh这些三角函数,功能和数学中的一样,用法与上面所提到的方法基本一样

文本函数

oracle中的文本操作函数或者说是字符串操作函数如下

length(s)

ascii(s)

chr(n)

upper(s)

lower(s)

initcap(s)

ltrim(s[,k]

rtrim(s[,k])

trim([[option][c from ]]s)

lpad(s,n[,k])

rpad(s,n[,k])

substr(s,n[,m])

instr(s,k)

instr(s,k,n)

instr(s,k,n,m)

translate(s,v,m)

replace(s,v)

resplace(s,v,w)

concat(s1,s2)


length(s)

select ename ,length(ename) from emp;

该函数的作用是返回字符串参数s的长度

ascii(s)

select ename ,ascii(ename) from emp;

该函数的作用是返回字符串参数s的第一个字符对应的ascii码值

chr(n)

select chr(65),chr(97) from dual;

结果

C C

- -

A a

该函数的作用是返回在ascii码中参数n对应的字符

upper(s)和lower(s)

select ename,upper(ename),lower(ename) from emp;

这两个函数的作用分别是将参数s全部转换成大写和小写字母

initcap(s)

select ename,initcap(ename) from emp;

该函数的作用是将参数s的第一个字符转换成大写

ltrim(s[,k]和rtrim(s[,k])

select ename,ltrim(ename,'K'),rtrim(ename,'K') from emp;

ltri(s,k)的作用:首先取得参数s的第一个字符,判断是否为字符k,如果是则

将k剪掉,再取第二个字符判断是否是k,如果是则剪掉继续判断,如果不是则结束判断

返回结果,如果不带参数k那么默认是去掉参数s左边的空格

rtrim(s[,k])是从参数s的右边开始判断

trim([[option][c from ]]s) option=leading ,trailing,both

select

' aabb ' ,

trim(' aabb '),

trim(both from ' aabb '),

trim(leading from ' aabb '),

trim(trailing from ' aabb '),

trim(leading 'a' from 'aabbaa'),

trim(trailing 'a' from 'aabbaa'),

trim(both 'a' from 'aabbaa') from dual;

结果是

'AABB' TRIM TRIM TRIM(L TRIM(T TRIM TRI TR

-------- ---- ---- ------ ------ ---- --- --

aabb aabb aabb aabb aabb bbaa aab bb

trim(s)等价于trim(both from s)去掉两边的空格

trim(leading from s)去掉参数s前面的空格

trim(trailing from s)去掉参数s后面的空格

trim(leading 'a' from s)去掉参数s前面的a

trim(trailing 'a' from s)去掉参数s后面的a

trim(both 'a' from s)去掉参数s两边的a

lpad(s,n[,k])和rpad(s,n[,k])

select ename,lpad(ename,10,'*'),lpad(ename,2),rpad(ename,10,'*'),rpad(ename,3) from emp;

lpad(s,n[,k])的作用是将字符串s的长度变成n,如果s长度小于n则在左边用参数k补充,如果s长度

大于n,则从左边截取n个字符返回

rpad(s,n[,k])的作用是与lpad类似,如果s长度小于n则在右边用参数k补充,如果s长度

大于n,则从右边截取n个字符返回

substr(s,n[,m])

select ename,substr(ename,2,3) from emp;

该函数的作用是从参数s的第n个字符开始截取,长度为m,如果不带参数m,默认截取到s的最后

instr(s,k) instr(s,k,n) instr(s,k,n,m)

select ename,instr(ename,'A'),instr(ename,'A',3),instr(ename,'A',4),instr(ename,'A',3,2) from emp;

instr(s,k)的作用是字符串或者字符k在s中第一次出现的位置,

instr(s,k,n)的作用是从第n个位置开始,符串或者字符k在s中第一次出现的位置

instr(s,k,n,m)的作用是从第n个位置开始,符串或者字符k在s中第m次出现的位置

translate(s,v,m)

select ename,translate(ename,'A','B') from emp;

该函数的作用是用符串或者字符m替换符串或者字符n

replace(s,v)

select ename ,replace(ename,'AR'),replace(ename,'A') from emp;

该函数的作用是移除字符串s中的符串或者字符v

replace(t,v,w)

select ename,replace(ename,'AR','aaaaaaa') from emp;

用字符串w替换字符串v

concat(s1,s2)

select ename,job,concat(ename,job),ename||job from emp;

该函数的作用是连接两个字符串,作用相当于||

Postgres 格式化函数提供一套有效的工具用于把各种数据类型(日期/时间,int,float,numeric)转换成格式化的字符串以及反过来从格式化的字符串转换成原始的数据类型。
注意:所有格式化函数的第二个参数是用于转换的模板。
表 5-7. 格式化函数

函数返回描述例子
to_char(timestamp, text)text把 timestamp 转换成 stringto_char(timestamp 'now','HH12:MI:SS')
to_char(int, text)text把 int4/int8 转换成 stringto_char(125, '999')
to_char(float, text)text把 float4/float8 转换成 stringto_char(125.8, '999D9')
to_char(numeric, text)text把 numeric 转换成 stringto_char(numeric '-125.8', '999D99S')
to_date(text, text)date把 string 转换成 dateto_date('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(text, text)date把 string 转换成 timestampto_timestamp('05 Dec 2000', 'DD Mon YYYY')
to_number(text, text)numeric把 string 转换成 numericto_number('12,454.8-', '99G999D9S')
表 5-8. 用于 date/time 转换的模板

模板描述
HH一天的小时数 (01-12)
HH12一天的小时数 (01-12)
HH24一天的小时数 (00-23)
MI分钟 (00-59)
SS秒 (00-59)
SSSS午夜后的秒 (0-86399)
AM or A.M. or PM or P.M.正午标识(大写)
am or a.m. or pm or p.m.正午标识(小写)
Y,YYY带逗号的年(4 和更多位)
YYYY年(4和更多位)
YYY年的后三位
YY年的后两位
Y年的最后一位
BC or B.C. or AD or A.D.年标识(大写)
bc or b.c. or ad or a.d.年标识(小写)
MONTH全长大写月份名(9字符)
Month全长混合大小写月份名(9字符)
month全长小写月份名(9字符)
MON大写缩写月份名(3字符)
Mon缩写混合大小写月份名(3字符)
mon小写缩写月份名(3字符)
MM月份 (01-12)
DAY全长大写日期名(9字符)
Day全长混合大小写日期名(9字符)
day全长小写日期名(9字符)
DY缩写大写日期名(3字符)
Dy缩写混合大小写日期名(3字符)
dy缩写小写日期名(3字符)
DDD一年里的日子(001-366)
DD一个月里的日子(01-31)
D一周里的日子(1-7;SUN=1)
W一个月里的周数
WW一年里的周数
CC世纪(2 位)
JJulian 日期(自公元前4712年1月1日来的日期)
Q季度
RM罗马数字的月份(I-XII;I=JAN)-大写
rm罗马数字的月份(I-XII;I=JAN)-小写
所有模板都都允许使用前缀和后缀修改器。模板里总是允许使用修改器。前缀 'FX' 只是一个全局修改器。

表 5-9. 用于日期/时间模板 [b]
to_char
() 的后缀[/b]

后缀描述例子
FM填充模式前缀FMMonth
TH大写顺序数后缀DDTH
th小写顺序数后缀DDTH
FX固定模式全局选项(见下面)FX Month DD Day
SP拼写模式(还未实现)DDSP
用法须知:

如果没有使用 FX 选项,to_timestamp 和 to_date 忽略空白。FX 必须做为模板里的第一个条目声明。

反斜杠("\")必须用做双反斜杠("\\"),例如
'\\HH\\MI\\SS'。
双引号('"')之间的字串被忽略并且不被分析。如果你想向输出写双引号,你必须在双引号前面放置一个双反斜杠('\\'),例如
'\\"YYYY Month\\"'。
to_char 支持不带前导双引号('"')的文本,但是在双引号之间的任何字串会被迅速处理并且还保证不会被当作模板关键字解释(例如:'"Hello Year: "YYYY')。

表 5-10. 用于 [b]to_char(numeric) 的模板[/b]

模板描述
9带有指定位数的值
0前导零的值
. (句点)小数
, (逗号)分组(千)分隔符
PR尖括号内负值
S带负号的负值(使用本地化)
L货币符号(使用本地化)
D小数点(使用本地化)
G分组分隔符(使用本地化)
MI在指明的位置的负号(如果数字 < 0)
PL在指明的位置的正号(如果数字 > 0)
SG在指明的位置的正/负号
RN罗马数字(输入在 1 和 3999 之间)
TH or th转换成序数
V移动 n 位(小数)(参阅注解)
EEEE科学记数。现在不支持。
用法须知:

使用 'SG','PL' 或 'MI' 的带符号字并不附着在数字上面;例如,to_char(-12, 'S9999') 生成
' -12',而 to_char(-12, 'MI9999') 生成
'- 12'。Oracle 里的实现不允许在
9 前面使用 MI,而是要求 9 在 MI 前面。
PL,SG,和 TH 是 Postgres 扩展。

9 表明一个与在 9 字串里面的一样的数字位数。如果没有可用的数字,那么使用一个空白(空格)。
TH 不转换小于零的值,也不转换小数。TH 是一个 Postgres 扩展。

V 方便地把输入值乘以 10^n,这里 n 是跟在 V 后面的数字。to_char 不支持把
V 与一个小数点绑在一起使用(例如. "99.9V99" 是不允许的)。

表 5-11. [b]to_char 例子[/b]

输入输出
to_char(now(),'Day, HH12:MI:SS')'Tuesday , 05:39:18'
to_char(now(),'FMDay, HH12:MI:SS')'Tuesday, 05:39:18'
to_char(-0.1,'99.99')' -.10'
to_char(-0.1,'FM9.99')'-.1'
to_char(0.1,'0.9')' 0.1'
to_char(12,'9990999.9')' 0012.0'
to_char(12,'FM9990999.9')'0012'
to_char(485,'999')' 485'
to_char(-485,'999')'-485'
to_char(485,'9 9 9')' 4 8 5'
to_char(1485,'9,999')' 1,485'
to_char(1485,'9G999')' 1 485'
to_char(148.5,'999.999')' 148.500'
to_char(148.5,'999D999')' 148,500'
to_char(3148.5,'9G999D999')' 3 148,500'
to_char(-485,'999S')'485-'
to_char(-485,'999MI')'485-'
to_char(485,'999MI')'485'
to_char(485,'PL999')'+485'
to_char(485,'SG999')'+485'
to_char(-485,'SG999')'-485'
to_char(-485,'9SG99')'4-85'
to_char(-485,'999PR')'<485>'
to_char(485,'L999')'DM 485
to_char(485,'RN')' CDLXXXV'
to_char(485,'FMRN')'CDLXXXV'
to_char(5.2,'FMRN')V
to_char(482,'999th')' 482nd'
to_char(485, '"Good number:"999')'Good number: 485'
to_char(485.8,'"Pre-decimal:"999" Post-decimal:" .999')'Pre-decimal: 485 Post-decimal: .800'
to_char(12,'99V999')' 12000'
to_char(12.4,'99V999')' 12400'
to_char(12.45, '99V9')' 125'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: