日期:2014-05-16 浏览次数:20572 次
1.DECODE(exp,s1,r1,s2,r2..s,r) 可以把它理解成一个增强型的if else,只不过它并不通过多行语句,而是在一个函数内实现if else的功能。 2.sign(exp) 判断正负数的,如果exp为负数则返回-1,为正数则返回1,为0则返回0;exp可以为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;
?