oracle decode函数判断条件空_啃食Oracle:解码函数DECODE

啃食Oracle:解码函数DECODE

b3879d83c6e3a859252be0968d568b46.png

用途

此函数所属的函数组为Encoding and Decoding Functions,同组函数如下:

DECODE

DUMP

ORA_HASH

VSIZE

其它函数用的较少,以下主要讨论DECODE函数。

DECODE函数是干嘛的呢?如其名字,解码!谍战剧看过吧,一个特工一个密码本,根据密文解出明文,这个DECODE是密码本吗,不是,它是特工,这个特工能把一个输入值解析成输入值所代表的其它值!我们来看看它的定义与使用方法。

06141f63525255564f2730e029c33af3.gif

来自官方文档

文字描述为

DECODE(expr, search, result [, search, result ]... [, default ])

从上面的官方文档给出的定义可以看出:

1)expr表达式为必须部分,须为变量定值或表达式,不能为条件语句,且expr不应该为复杂的数据类型,应为数字、字符类型等简单类型;

2)搜索匹配项最少要有一项,且搜索项(search)为固定值;

3)如果有重复搜索值,则靠前直接返回,后续的重复值无效;

4)default为无法找到搜索匹配值的默认值,为可选部分;

5)各个匹配项的返回值和默认(default)返回值(result)类型须相同。

举个栗子

with XS as(select 1 XH,'张山' XM,'31' BJ from dualunionselect 2 XH,'李斯' XM,'31' BJ from dualunionselect 3 XH,'王武' XM,'32' BJ from dualunionselect 4 XH,'放牛娃' XM,'' BJ from dual)select xh,xm,decode(BJ,'31','三年一班','32','三年二班','无班级信息') BJXX from XS

本例中使用with创建模拟表,表中BJ是代码,不方便阅读,所以使用decode进行解码转义成可阅读信息,结果如下:

887eb981cb7f6cba171c7b46cf8a63c1.png

此例仅为练习小例,下面看一个代码片段

select ksh,xm,--语文max(decode(kmdm,'101',kmdm,'109',kmdm,'117',kmdm)) km1dm,max(decode(kmdm,'101',kmmc,'109',kmmc,'117',kmmc)) km1mc,max(decode(kmdm,'101',zf,'109',zf,'117',zf)) km1cj,--数学max(decode(kmdm,'202',kmdm,'211',kmdm,'219',kmdm)) km2dm,max(decode(kmdm,'202',kmmc,'211',kmmc,'219',kmmc)) km2mc,max(decode(kmdm,'202',zf,'211',zf,'219',zf)) km2cj,--外语max(decode(kmdm,'303',kmdm,'304',kmdm,'305',kmdm)) km3dm,max(decode(kmdm,'303',kmmc,'304',kmmc,'305',kmmc)) km3mc,max(decode(kmdm,'303',zf,'304',zf,'305',zf)) km3cjfrom all_zfgroup by ksh,xmorder by ksh;

此例中all_zf中每位学生单科成绩作为一个记录行存放,最后的成绩表要求每名学生只保留一行数据,这就需要进行行列转换。首先外层使用考号ksh,xm进行分组,需要在一列显示的科目使用DECODE在一起解码组成新列。例子中语文、数学、外语都有多种情况,比如外语包括英语、日语、俄语等情况,所以需要将此类的科目组合成外语类的列,km3dm,km3mc,km3cj。

再举个排序的例子,还是练习小例中的故事,领导就是想把三年二班的同学排前面怎么办呢?

with XS as(select 1 XH,'张山' XM,'31' BJ from dualunionselect 2 XH,'李斯' XM,'31' BJ from dualunionselect 3 XH,'王武' XM,'32' BJ from dualunionselect 4 XH,'赵榴' XM,'33' BJ from dualunionselect 5 XH,'放牛娃' XM,'' BJ from dual)select xh,xm,decode(BJ,'31','三年一班','32','三年二班','33','三年三班','无班级信息') BJXXfrom XSorder by decode(bj,'32',1,'31',2,'33',3,4);
21b4a529d588a9f5ea07ad8aca03c859.png

注意看排序部分,将班级编号重新解码进行排序,这种操作能够满足特殊需求。不是领导的要求变态,是现实世界太复杂,熟练掌握SQL适应所需。

综上就是DECODE的函数介绍与使用。这个函数的用途广泛,尤其是和分组查询进行组合使用,会发挥巨大作用。DECODE函数和CASE表达式简单模式在功能上有相同之处,不过DECODE写法更简单,在多处可以替代CASE表达式,使编码简洁。

原创不易,请支持!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值