Oracle 函数: decode()
英文翻译过来:解码, 简单来说可以理解为翻译字段。 翻译表中的数据也是它最常用的一种用法。下面为大家列举了decode的一些用法,供参考!
- 字段翻译
比如说:在一个学生表里,里面有性别字段,我们用0代表男生,1代表女生,大致数据如下:
ID | NAME | AGE | SEX |
---|---|---|---|
1 | 铁柱 | 23 | 0 |
2 | 翠花 | 18 | 1 |
在实际设计数据库表的时候,往往有很多字段的值就是固定那么几个,所以为了节约资源等,往往都会用char(1)来代表各种含义。比如说公司里的岗位,性别等,
上面这个学生表里,我要想向用户显示的里面性别不要出现0,1这种,这是我们在设计层面考虑到存0,1会比较方便,节约了一定内存,但是在实际的业务中,显示肯定不能把简单的0,1这些显示出来,要把它的实际含义写出来。这里就可以用到decode()函数了:
select id,name,age,
decode(sex,'0','男生','1','女生') as sex from student;
- 这样显示出来的值,0会被男生代替,1则会被女生代替。
语法
- 这里可以看出来decode的语法非常容易理解:decode(条件,值1,返回值1,值2,返回值2,返回值Last)
- 稍微翻译一下就是:如果条件等于值1,那么显示的就是返回值1,以此类推直到匹配到对应的值,和 Java中的[Switch]类似。
- 这里的值1与返回值1中间可以有任意对,最后返回值Last是当前面的值都不匹配时就返回这个。
参数里面的值、返回值都可以是表达式
- 比较大小
这里的话会比较常用到一个函数 sign(value),它会根据value的值正数、0、负数,分别返回1、0、-1.
还是拿学生表为例子,我想要查询出来的数据多一列,小于18岁的为学生,大于等于18岁为青年。
select id,name,age,
decode(sign(age-18),'1','青年','0','青年','-1','学生') as ages from student;
- 有些资料中还会有另一个用法:分段。 其实分段和比较大小是异曲同工的。只是在不同的业务场景。比如学生的成绩,我们可以给成绩进行分段,从而给出优秀,良好等,这里同样也可以使用sign+decode结合的方式。
应用场景
在实际业务中,大多在视图【View】里用到decode的场景会很多。在工作中,真正涉及到一些复杂的业务,有些是需要考虑整个项目的设计,还有些是和数据打交道的,这个时候视图【View】和存储过程【procedure】就额外重要了。这个里面还可能会用到其它更多的函数,所以想要能够对视图、存储过程熟练, 基本的函数 是必不可少的。