Oracle中的表达式where子句

问题描述:

我有一个标准搜索子句,我选择某些过滤器上的记录,如描述和状态,状态值是101到110.状态可能为空,如果是这样,我将返回任何记录状态。但是,我现在有一个新状态,在没有特定状态时必须从返回的记录中排除,并且只有在特别选定时才返回。因此,基于特定状态的搜索仅返回该状态,没有特定状态的搜索将返回除新的状态之外的所有状态。原来的where子句是:Oracle中的表达式where子句

where Upper(cfs.CAE_SEC_ID) = Upper(NVL(p_cae_sec_id_n,cfs.CAE_SEC_ID)) 
and Upper(SEC_CODE) like '%' || Upper(NVL(p_fm_sec_code_c,SEC_CODE)) || '%' 
and APPR_STATUS = NVL(p_appr_status, APPR_STATUS) 
order by appr_status DESC, cae_sec_id 

我现在想要做的是这样的:

where Upper(cfs.CAE_SEC_ID) = Upper(NVL(p_cae_sec_id_n,cfs.CAE_SEC_ID)) 
and Upper(SEC_CODE) like '%' || Upper(NVL(p_fm_sec_code_c,SEC_CODE)) || '%' 
and APPR_STATUS = 
    (CASE WHEN p_appr_status is null THEN --return all statuses except 110 
    WHEN p_appr_status is not null THEN (p_appr_status) 
    END) 
order by appr_status DESC, cae_sec_id 

这可能与CASE表达式在where子句中?


@Damien提供了答案,所以感谢他。还有另一个场景需要我去处理 - 同一个proc会返回单个以及多个记录。如果有人在一个单独的记录搜索(p_cae_sec_id_n不为空),有则忽略这是被排除在上述的状态,所以我以如下的添加它:

and APPR_STATUS = 
    (CASE WHEN p_appr_status is null and APPR_STATUS != 110 THEN APPR_STATUS 
    WHEN (p_appr_status is null and p_cae_sec_id_n is not null) THEN APPR_STATUS 
    WHEN p_appr_status is not null THEN (p_appr_status) 
    END) 
+0

我想你应该添加一个“其他”条款,以回报您在其他情况下想要什么,甚至如果它是空的。否则,如果例如p_appr_status为null且appr_status = 110,则可能会得到奇怪的结果。 – 2011-09-09 14:58:48

我更多的是SQL的服务器的家伙,但下面应该做的伎俩(假设Oracle的不等于就是<>,不!=):

(CASE WHEN p_appr_status is null and APPR_STATUS<>101 THEN APPR_STATUS 
    WHEN p_appr_status is not null THEN (p_appr_status) 
    END) 
+0

Oracle对''或'!='满意,请选择:) – 2011-03-01 10:50:37

+0

感谢。还有另一个场景需要处理,所以我不得不扩展查询,我在下面添加了这个查询。 – 2011-03-01 11:20:39