一、用到这几个函数的情景:
数据库中,有一条记录的几个字段是以字符串形式存储的数据,其中有些是空的
现在假设这几个字段的值分别为 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:截取的字符串长度,如果为空,默认截取到字符串结尾