Oracle和CognosFrameworkManager中decode的妙用我们都知道Decode函数可以用来做什么作用,如果这个不知道的话,请找下度娘。那么,今天就来介绍一下,在WHERE条件语句里面使用Decode函数。www.2cto.com由浅入...SyntaxHig
Oracle和Cognos Framework Manager中decode的妙用
我们都知道Decode函数可以用来做什么作用,如果这个不知道的话,请找下度娘。
那么,今天就来介绍一下,在WHERE条件语句里面使用Decode函数。
www.2cto.com
由浅入深,先一步一步来。。
Sql代码
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
这一步,没有问题。看这个,晕了没有:
Sql代码
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)
;
换一种写法:
Sql代码
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 = &#39;b&#39;)
这样看懂了吧。。
其实decode在这种情况下只是一种简写而已。
但是对于Cognos FrameworkManager,就是用来匹配参数了。
就是用于根据传递过来的参数的不同,使用不同的过滤条件。
Sql代码
with tmp as(
select 1 val,null flag from dual union all
select 1 val,&#39;a&#39; flag from dual union all
select 2 val,&#39;b&#39; flag from dual union all
select 3 val,&#39;c&#39; flag from dual
)
select 1,decode(flag,&#39;a&#39;,1,&#39;b&#39;,2,&#39;c&#39;,3, 0)
from tmp
and decode(#prompt(&#39;display&#39;,&#39;string&#39;) #,&#39;1&#39;,1,
&#39;2&#39;,val,
&#39;0&#39;)
=
decode(#prompt(&#39;display&#39;,&#39;string&#39;) #, &#39;1&#39;,1,
&#39;2&#39;,2,
&#39;1&#39;)
解释一下,当display参数为1 的时候,不过滤。
当display参数为2的时候,过滤val =2 。
当display参数为空或者其他的时候,过滤掉所有的 0=1。
活学活用。。
今天又发现,CASE WHEN也能如此方便地使用:
Sql代码
with tmp as(
select 1 id, &#39;kelly&#39; name from dual union all
select 2 id, &#39;sam&#39; name from dual union all
select 3 id, &#39;jason&#39; name from dual union all
select 4 id, &#39;kobe&#39; 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
;