2013-08-07 42 views
17

我是全新的Oracle世界,因此这可能是垒球。在处理SSRS报告时,我将一串状态传递给一个视图。扭曲的是,用户也可以从状态列表中选择一个名为“[没有选择]”的选择......(这部分不是在做,我坚持以这种方式实施)有条件的WHERE子句与Oracle中的CASE语句

如果他们选择没有选择选项,那么我只是想要默认返回所有的状态,否则返回在我的逗号分隔列表中的状态列表。

这真的看起来应该很容易,但我卡住了。这是我迄今为止的代码(只是为了获得一个样本来工作),但我的眼睛终于消失了,试图去实现它。

请问有人能给我这个指示吗?

 
begin 
    :stateCode:='MO,FL,TX'; 
    --:stateCode:='[ No Selection ]'; 
end; 
/

select count(*) as StateCount, :stateCode as SelectedVal 
from hcp_state vw 
where 
    (case 
     when (:stateCode = '') then (1) 
     when (:stateCode != '') then (vw.state_cd in (:stateCode)) 
     (else 0) 
    end) 
; 

回答

34

你可以写where子句:

where (case when (:stateCode = '') then (1) 
      when (:stateCode != '') and (vw.state_cd in (:stateCode)) then 1 
      else 0) 
     end) = 1; 

另外,除去case完全:

where (:stateCode = '') or 
     ((:stateCode != '') and vw.state_cd in (:stateCode)); 

,或者甚至更好:

where (:stateCode = '') or vw.state_cd in (:stateCode) 
+0

'(否则0)'不应该有括号。 – zygimantus

+1

@zygimantus。 。 。谢谢。它真的好奇,没有编辑历史,因为代码的格式与我通常的缩进风格截然不同。现在全部修好了。 –