2011-03-01 77 views
1

我有一個標準搜索子句,我選擇某些過濾器上的記錄,如描述和狀態,狀態值是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

回答

3

我更多的是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