我有一個標準搜索子句,我選擇某些過濾器上的記錄,如描述和狀態,狀態值是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)
我想你應該添加一個「其他」條款,以回報您在其他情況下想要什麼,甚至如果它是空的。否則,如果例如p_appr_status爲null且appr_status = 110,則可能會得到奇怪的結果。 – 2011-09-09 14:58:48