case when的功能相对于Decode强大不少,但是decode使用起来,相对于Decode简单,而且sql语句看起来简约,但是对于复杂的情况下,decode就不行了,如果逻辑简单,使用Decode,如果逻辑比较的复杂,就不能用decode了,比如判断参数在某个范围的情况。

用在查询结果

查询的数据,我们想将数据格式化一下,所以就需要通过case when来进行操作,同时我们还可以简化这种操作,通过 DECODE这个函数,也可以解决类是的操作,但是decode的缺点是,只能判断值是否等于,所以对于判断大小,和空的情况,需要结合sign条件

select case
         when A.Tb_NO > 10 then
          'duitou'
         else
          'budui'
       end as casewhen
  from TABLE1 A

Oracle之case when和decode-yellowcong_sql语句

化成decode的写法

select decode(sign( A.Tb_NO - 10),1,'duitou','budui') as decode
    from TABLE1  A

Oracle之case when和decode-yellowcong_sql语句_02

DECODE细节

语法

decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

判断值的大小

sign()函数:根据某个值是0、正数、负数,分别返回0、1、-1
A>B, A-B>0, sign(A-B)=1, 获得大值即A, 
decode(sign(A-B),1,A,B) A<B, A-B<0, sign(A-B)=-1, 
获得小值即A, 
decode(sign(A-B),-1,A,B)

判断是否为空

decode(col1,NULL,col1,'AAA')

用在查询条件

SELECT * 
   FROM TABEL1 M1, 
        TABLE2 M2
  WHERE M1.Tb_CD = SUBSTR(M2.Tb_CD,1, case when M2.Yk_Kbn in ('1','3') then 2 else 1 end)

查询结果

Oracle之case when和decode-yellowcong_oracle_03

使用decode的写法

select * FROM TABEL1  M1, 
        TABLE2  M2
  WHERE M1.Tb_CD = SUBSTR(M2.Tb_CD,1, decode(M2.Yk_Kbn,'1',2,'3',2,1))

decode 的查询结果

Oracle之case when和decode-yellowcong_sql语句_04

查询的结果都一致