Oracle数据库中如果想要在sql查询中实现if else
这样的效果,不仅可以用case when
语法,本身提供了一个更为简便的函数,那就是decode
,下面来具体看下其使用方法。
为了演示 decode
的功能与case when
的相似,这篇就用decode
来实现上一篇记录case when
博客的效果。上一篇中的需求是
当字段
username
的值为ouxio
时,输出的是12345
,当值为hahaa
时,输出22344
,其他情况下都输出emmm
。
case when
篇具体代码如下:
select
case username
when 'ouxio' then '12345'
when 'hahaa' then '22344'
else 'emmm'
end
as password
from users;
而用decode
就简便不少,如下:
select
decode (username,'ouxio','12345','hahaa','22344','emmm') as password
from users;
decode
函数第一个参数是需要判断的字段,剩下的每两个参数
代表判断值
与输出值
,比如ouxio
和12345
这两个参数第一个是指当username
等于ouxio
时输出12345
,后面的每两个参数以此类推,这样的两两参数可写多个。而最后的一个参数emmm
,意思是当需要判断的字段都没有匹配的值时输出最后一个参数值emmm
,这个参数可写可不写。
对比
decode
函数和case when
很相似,都能完成同样的效果,那么有什么区别呢
- 特有性,
decode
函数是Oracle特有的函数,而case when
不仅Oracle,在mysql和sql server都可使用。 - 局限性,
decode
只能判断字段相等,但是可以配合sign
函数进行大于、小于、等于,case when
可用于更多的条件比较式,并且使用case搜索函数时可对比多个字段。
sign()
函数根据某个值是0、正数还是负数,分别返回0、1、-1,所以要用decode
判断与某个数的大小可如下
select
select decode(sign(5-3), 1 ,'大于', -1, '少于', 0 ,'相等') from dual
from users;
- 简便性,
decode
使用起来相对比较方便,case when
虽然繁琐但是更为强大灵活。
扩展 mysql if
函数
mysql也有类似decode
功能的函数,那就是if
函数,不过功能要逊色许多,只能判断单个条件,若想判断多条件还得用case when
。具体的if
使用方法如下:
select if(username = 'ouxio','me','you') as iswho from users;
当字段username
为ouxio
时,输出me
,不是时输出you
。