我们都知道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 ;