Decode函数在实际开发中非常的有用,而且功能比较强大,与其他函数结合,能让很多的工作变得简单;
DECODE(字段,
条件1,
结果值1,
条件2,
结果值2, …默认值);
该函数的含义如下:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
比较常见的一些用法:
1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2)
from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
select decode(sign(10-20),-1,10,20) from dual;
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
2、生成固定位数的序列号
我们看我们的水电煤等各种单子,经常有类似这种 2013000000000004这种固定长度的序列,我们可以结合Lpad函数,使主键的值自动加1并在前面补0;
select ‘2013‘ || LPAD(decode(count(ID),0,1,max(to_number(ID)+1)),12,‘0‘)
记录编号 from FFM83
FFM83 是一张做测试的表,ID是它的流水ID,有3条数据;
注意:这种写法虽然简单,但是如果用户多,在高并发情况下,可能会生成同样的序列号;
如果在高并发的情况下,可以参考下面这种写法:
select ‘2013‘ || LPAD(SEQ_ FFM83.NEXTVAL,12,‘0‘)
记录编号 from FFM83
SEQ_ FFM83是和FFM83表对应的一个SEQUENCE
3、简化多个条件的查询
比如我要查询男、女生的数量分别是多少?
通常我们这么写:
select count(*) from 表 where
性别=男;
select count(*) from 表 where
性别=女;
这样至少要查询2次,如果有更加多的选择的话,那么数据库的访问量会更加多;
用decode呢,只需要一句话
select sum(decode(sex,‘男‘,1,0)),sum(decode(sex,‘女‘,1,0))
from ffm83
ffm83 表中有一个sex字段,直接放了汉字的男女属性;
4、在Order by中使用Decode对指定字段进行排序
按照计算机,数学专业进行排序
例:
select * from ffm83 order by decode(subject, ‘计算机‘, 1, ‘数学‘,
2,10);
运行结果为:
女 1
计算机 2013/1/4
男 2
数学 2013/3/13
女 3
数学 2013/3/18
注意:在大数据量的排序中,尽量不要使用这种方式,数据库开销非常大;
5、将竖表转横表
我们要统计2013年上半年每个月有多少人,最好直接拉出来一张类似报表的样子。如果用常规的方法,会比较麻烦,用DECODE就会相对简单
SELECT SUM(DECODE(TO_CHAR(DT, ‘MM‘), ‘01‘, 1,0)) AS "1月"
, SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘02‘, 1,0)) AS "2月"
, SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘03‘, 1,0)) AS "3月"
, SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘04‘, 1,0)) AS "4月"
, SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘05‘, 1,0)) AS "5月"
, SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘06‘, 1,0)) AS "6月"
FROM FFM83;
运行结果如下:
1 0 2 0 0 0
备注:
表FF83的结构:
create table FFM83
(
SEX VARCHAR2(2),
ID INTEGER,
SUBJECT VARCHAR2(32),
DT DATE
);
表中的数据为:
女 1
计算机 2013/1/4
男 2
数学 2013/3/13
女 3
数学 2013/3/18