发现decode与case when的作用好像有点雷同,迷糊中。百度了一下,功能果然是差不多的,但还是有区别的。
我前面的一篇文章oracle中CASE WHEN的用法-实例中的SQL语句,都可以用decode实现,列举如下:
(1)
select u.id,u.realname,U.SEX,
( case u.sex
when 1 then '男'
when 2 then '女'
else '空的'
END
) 性别
from users u;
可改写为
select u.id,u.realname,U.SEX,
decode (u.sex,1,'男',2,'女','空')性别
from users u;
(2)
select
sum( case u.sex when 1 then 1 else 0 end) 男性,
sum( case u.sex when 2 then 1 else 0 end) 女性,
sum( case when u.sex<>1 and u.sex<>2 then 1 else 0 end) 性别为空
from users u;
可改写为
select
sum(decode(u.sex,1,1,0))男,
sum(decode(u.sex,2,1,0))女,
sum(decode(u.sex,1,0,2,0,1))性别为空
from users u;
(3)
select u.creator_id 创建者ID,
sum( case u.sex when 1 then 1 else 0 end) 男性,
sum( case u.sex when 2 then 1 else 0 end) 女性,
sum( case when u.sex<>1 and u.sex<>2 then 1 else 0 end) 性别为空
from users u
group by u.creator_id;
可改写为
select u.creator_id 创建者ID,
sum(decode(u.sex,1,1,0))男,
sum(decode(u.sex,2,1,0))女,
sum(decode(u.sex,1,0,2,0,1))性别为空
from users u
group by u.creator_id;
(4)
看起来,decode好像更简洁。
但是,有的情况下,却是使用case when相对简单些。如下。
例如:
SELECT CASE X-FIELD
WHEN X-FIELD < 40 THEN ‘X-FIELD < 40’
WHEN X-FIELD < 50 THEN ‘X-FIELD < 50’
WHEN X-FIELD < 60 THEN ‘X-FIELD < 60’
ELSE ‘UNBEKNOWN’END
FROM DUAL
在这种情况下,CASE语句显得比较简捷灵活。
当需要匹配少量数值时,选用Decode会更加方便一些。