Oracle和Cognos Framework Manager中decode妙用,CASE WHEN也可以!

浏览: 2010

我们都知道Decode函数可以用来做什么作用,如果这个不知道的话,请找下度娘。

那么,今天就来介绍一下,在WHERE条件语句里面使用Decode函数。

 

由浅入深,先一步一步来。。

with tmp as(
select 1 val,null flag from dual union all
select 1 val,'a' flag from dual union all
select 2 val,'b' flag from dual union all
select 3 val,'c' flag from dual
)
select 1,decode(flag,'a',1,'b',2,'c',3, 0)
from tmp

这样,我们查出来的数据为:

 1 1 --》a
 1 2 --》b
 1 3 --》c

 

这一步,没有问题。看这个,晕了没有:

with tmp as(
select 1 val,null flag from dual union all
select 1 val,'a' flag from dual union all
select 2 val,'b' flag from dual union all
select 3 val,'c' flag from dual
)
select 1,decode(flag,'a',1,'b',2,'c',3, 0)
from tmp
where decode(val,1,1,2)
= decode(flag,'a',1,'b',2,'c',3, 0)
;

换一种写法:

with tmp as(
select 1 val,null flag from dual union all
select 1 val,'a' flag from dual union all
select 2 val,'b' flag from dual union all
select 3 val,'c' flag from dual
)
select 1,decode(flag,'a',1,'b',2,'c',3, 0)
from tmp
where (val=1 and flag = 'a')
or
(val <> 1 and flag = 'b')

这样看懂了吧。。

其实decode在这种情况下只是一种简写而已。

 

但是对于Cognos FrameworkManager,就是用来匹配参数了。

就是用于根据传递过来的参数的不同,使用不同的过滤条件。

with tmp as(
select 1 val,null flag from dual union all
select 1 val,'a' flag from dual union all
select 2 val,'b' flag from dual union all
select 3 val,'c' flag from dual
)
select 1,decode(flag,'a',1,'b',2,'c',3, 0)
from tmp
and decode(#prompt('display','string') #,'1',1,
'2',val,
'0')
=
decode(#prompt('display','string') #, '1',1,
'2',2,
'1')

解释一下,当display参数为1 的时候,不过滤。

当display参数为2的时候,过滤val =2 。

当display参数为空或者其他的时候,过滤掉所有的 0=1。

 

活学活用。。

 

今天又发现,CASE WHEN也能如此方便地使用:

with tmp as(
select 1 id, 'kelly' name from dual union all
select 2 id, 'sam' name from dual union all
select 3 id, 'jason' name from dual union all
select 4 id, 'kobe' name from dual union all
select 5 id, null name from dual
)
select id, name from tmp
where id = case when length(name)>1 then length(name)
else 5 end
;
推荐 0
本文由 cognos小白 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册