Случайное выражение в Oracle, где предложение - PullRequest
1 голос
/ 01 марта 2011

У меня есть стандартное условие поиска, согласно которому я выбираю записи по определенным фильтрам, таким как описание и статус, значения статуса - от 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)

1 Ответ

3 голосов
/ 01 марта 2011

Я больше похож на SQL Server, но следующее должно помочь (если предположить, что 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...