У меня есть стандартное условие поиска, согласно которому я выбираю записи по определенным фильтрам, таким как описание и статус, значения статуса - от 101 до 110. Статус может быть нулевым, если так, я возвращаю записи любого статуса. Однако у меня теперь есть новый статус, который должен быть исключен из возвращенных записей, когда нет определенного статуса, и возвращен только тогда, когда он специально выбран. Таким образом, поиск, основанный на определенном статусе, возвращает только этот статус, а поиск без определенного статуса возвращает все статусы, кроме нового. Оригинальное предложение 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?
@ Дэмиен дал ответ, так что спасибо ему за это. Есть еще один сценарий, который мне нужен - один и тот же процесс возвращает как отдельные, так и несколько записей. Если кто-то ищет отдельную запись (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)