`

巧用decode() 和 sign()比较大小求最大最小

阅读更多

巧用decode() sign()

 

简单回顾一下这两个函数


1.DECODE(exp,s1,r1,s2,r2..s,r)


2.sign(exp) 判断正负数的,如果exp为负数则返回-1,为正数则返回1,为0则返回0exp可以为number也可以为表达式。
这两个函数都是非常重要的函数也是比较常用的函数,估计大家都已经用过n次了,但是如果把这两个函数结合起来使用就能帮我们完成between and 的功能。
1.a b c三个变量去实验b在这三个数中的位置(顺序)

SQL> var a number;
SQL> var b number;
SQL> var c number;
SQL> exec :a:=1;:b:=2;:c:=3;

PL/SQL
过程已成功完成。

SQL> select decode(sign(:b-:c)+sign(:b-:a),-2,'
最小',-1,'小于等于',0,'中间',1,'
大于等于',2,'最大
') from dual;

DECODE(S
--------
中间


SQL> exec :a:=4;:b:=2;:c:=3;
                             ;
PL/SQL
过程已成功完成。

SQL> select decode(sign(:b-:c)+sign(:b-:a),-2,'
最小',-1,'小于等于',0,'中间',1,'
大于等于',2,'最大
') from dual;

DECODE(S
--------
最小


SQL> exec :a:=1;:b:=2;:c:=-1;
                             ;
PL/SQL
过程已成功完成。

SQL> select decode(sign(:b-:c)+sign(:b-:a),-2,'
最小',-1,'小于等于',0,'中间',1,'
大于等于',2,'最大
') from dual;

DECODE(S
--------
最大


SQL> exec :a:=2;:b:=2;:c:=3;
                             ;
PL/SQL
过程已成功完成。

SQL> select decode(sign(:b-:c)+sign(:b-:a),-2,'
最小',-1,'小于等于',0,'中间',1,'
大于等于',2,'最大
') from dual;

DECODE(S
--------
小于等于


SQL> exec :a:=1;:b:=2;:c:=2;
                             ;
PL/SQL
过程已成功完成。

SQL> select decode(sign(:b-:c)+sign(:b-:a),-2,'
最小',-1,'小于等于',0,'中间',1,'
大于等于',2,'最大
') from dual;

DECODE(S
--------
大于等于


SQL>
可见
sign(:b-:c)+sign(:b-:a)=-2
b为三个数中最小,
sign(:b-:c)+sign(:b-:a)=-1
b等于其中一个,小于另一个,
sign(:b-:c)+sign(:b-:a)=0
b为三个数中中间的一个,
sign(:b-:c)+sign(:b-:a)=1
b等于其中一个,大于另一个,
sign(:b-:c)+sign(:b-:a)=2
b为三个数中最大,
这样实现between and 的功能就非常简单了
b between a and c
就等价于 decode(sign(:b-:c)+sign(:b-:a),0,XXX,-1,XXX,1,XXX).
也可以实现判断某个日期是否在某个时间段之间

select decode(sign(months_between(sysdate,sysdate-1)),1,XXX,0,XXXX,1,XXXX) from dual;
做这个简单的实验与大家share,多指教。
可以把它理解成一个增强型的if else,只不过它并不通过多行语句,而是在一个函数内实现if else的功能。

 

 

select decode(:b,least(:a,:b,:c),'最小',GREATEST(:a,:b,:c),'最大','中间')
from dual

不过还要考虑一下b ac相等的情况,就不是最大最小

 

随着CASE的出现,一切都失去了意义。
SIGN方法只能用于数字,字符串比较还得靠LEAST, GREATEST

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics