oracle的几个函数,greatest,to_number,decode

一、用到这几个函数的情景:

数据库中,有一条记录的几个字段是以字符串形式存储的数据,其中有些是空的

现在假设这几个字段的值分别为 A='2048'、B='1024'、C=''

我想取出A、B、C三者的最大值,通过函数greatest(A,B,C)可以得到

但是问题来了,A、B、C都是字符串,要先转成数字,通过to_number(A)可以实现,

结合起来:greatest(to_number(A),to_number(B),to_number(C))

根据测试,因为C是空值,则to_number(C)也是空值,

从而greatest(to_number(A),to_number(B),to_number(C))也是空值

所以要用decode将空值变成0(根据各自的事迹情况来确定空值用什么来代替),decode(C,null,'0',C)

那么最终的函数为:greatest(to_number(A),to_number(B),to_number(decode(C,null,'0',C)))

函数解释:

1、GREATEST(n1,n2,...n) 返回序列中的最大值

2、LEAST(n1,n2....n) 返回序列中的最小值

3、TO_NUMBER(c[,fmt[,nls]]) 将char,nchar,varchar2,nvarchar2型字串按照fmt中指定格式转换为数值类型并返回。

4、DECODE(exp,s1,r1,s2,r2..s,r[,def]) 可以把它理解成一个增强型的if else,只不过它并不通过多行语句,而是在一个函数内实现if else的功能。exp做为初始参数。s做为对比值,相同则返回r,如果s有多个,则持续遍历所有s,直到某个条件为真为止,否则返回默认值def(如果指定了的话),如 果没有默认值,并且前面的对比也都没有为真,则返回空。

二、顺便讲讲substr、instr

假设某个字段A='1024/2048',我要将其分解成'1024'和'2048'

'1024'=substr(A,1,instr(A,'/')-1)

'2048'=substr(A,instr(A,'/')+1)

函数解释:

1、INSTR(c1,c2[,n1[,n2]]) 返回c2在c1中位置

c1:原字符串

c2:要寻找的字符串
n1:查询起始位置,正值表示从左到右,负值表示从右到左 (大小表示位置,比如3表示左面第3处开始,-3表示右面第3处开始)。如果为0的话,则返回的也是0
n2:第几个匹配项。大于0

2、SUBSTR(c1,n1[,n2]) 截取指定长度的字符串。稍不注意就可能充满了陷阱的函数。
n1:开始长度,如果n1=0 then n1=1,如果n1>0,则oracle从左向右确认起始位置截取,如果n1<0,则oracle从右向左数确认起始位置,如果n1>c1.length则返回空
n2:截取的字符串长度,如果为空,默认截取到字符串结尾

猜你喜欢

转载自wuliwei85.iteye.com/blog/1420652