orcl 中decode的妙用
在不认识这个函数之前,我们要对同一张表或者同一查询语句块中的某一个字段进行计算分类统计时,要用到很多函数以及外连接。用这一函数往往可以解决很多复杂的东西。
网上的一段具有代表性的decode用法,不用做过多解释,便一目了然。当然他的运用不仅仅于此。
select id, decode(sign(score-85),1,'优秀',0,'优秀',-1, decode(sign(score-70),1,'良好',0,'良好',-1, decode(sign(score-60),1,'及格',0,'及格',-1,'不及格'))) from student;
我在实际开发中遇到过一个类似场景,要统计一个字段的值,在java后台去做相应的处理,刚开始我用的是对不同值检索然后再查询:
select d.su, a.green, b.yellow, c.red from (select count(*) green from zx_gzdb_task where waring = '1') a, (select count(*) yellow from zx_gzdb_task where waring = '2') b, (select count(*) red from zx_gzdb_task where waring = '3') c, (select count(*) su from zx_gzdb_task) d;
用decode后:
select sum(decode(z.waring, '1', '1', '0')) green, sum(decode(z.waring, '2', '1', '0')) yellow, sum(decode(z.waring, '3', '1', '0')) red, count(*) su from zx_gzdb_task z;
更多用途及函数语法分析:
1、DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。DECODE有什么用途 呢? 先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%,通常的做法是,先选出记录 中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else或choose case之类的流控制语句进行判断。 如果用DECODE函数,那么我们就可以把这些流控制语句省略,通过SQL语句就可以直接完成。如下:select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee 是不是很简洁?
2、DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value 等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。
3、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
语法:
Decode函数的语法结构如下:
decode (expression, search_1, result_1)
decode (expression, search_1, result_1, search_2, result_2)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n)
decode (expression, search_1, result_1, default)
decode (expression, search_1, result_1, search_2, result_2, default)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)
decode函数比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。
2018-12-11补充;
decode 子查询的使用:
select decode(1, '1',(select 1 from dual), '2',(select 2 from dual ), '3',(select 3 from dual), '4',(select 4 from dual) ) as mc from dual;