转:巧用decode() 和 sign()

转:http://www.itpub.net/viewthread.php?tid=1048370&extra=page%3D1%26amp%3Bfilter%3Ddigest

这两函数我都用过,可这个组合咋没想到,记录下..

巧用decode() 和 sign()

[@more@]巧用decode() 和 sign()
简单回顾一下这两个函数
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;
做这个简单的实验与大家share,多指教。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16115580/viewspace-1018210/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16115580/viewspace-1018210/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值