背景:
近期在处理同事的存储过程的时候,由于业务规则的调整,发现对查询的数据类型列需要进行大小比较,满足两个数据相减,如果大于0,则取两个数据相减,否则取被减数。由于特殊场景,需要使用sign函数进行比较,decode函数进行选择实现上面的业务场景。
概念:
sign函数:
语法:
sign(n);
说明:
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0(n可以是表达式,例如n可以写成(n-200))
decode函数:
语法:
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
函数含义:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
decode(字段或字段的运算,值1,值2,值3)
这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多
示例演示:
为获得两个字段的较大值或较小值:
A>B, A-B>0,sign(A-B)=1,获得大值即A, decode(sign(A-B),1,A,B)
A<B, A-B<0, sign(A-B)=-1,获得小值即A, decode(sign(A-B),-1,A,B)
现在以具体数据来演示:A为1,B为2
1.返回两个数值的较小值
语句:SELECT DECODE(SIGN(1-2),-1,1,2) FROM DUAL;
对应结果:
2.返回两个数值的较大值
语句:SELECT DECODE(SIGN(1-2),1,1,2) FROM DUAL;
对应结果:
业务场景中的实现:
业务描述:
字段A与字段B进行比较,当A-B大于0时候,直接去A-B的值,若小于0,则取数字段A的值。
实现语句:
SELECT DECODE(SIGN(A-B), 1, A-B,-1,A) FROM TAB;
--
SELECT DECODE(SIGN(1-2), 1, 1-2,-1,1) FROM DUAL;