Повторное выполение запроса если предыдущий результат ничего не вернул

Можно ли изменит запрос так, что бы если результат его выполнения ничего не возвращает он выполнялся без учета одного из параметров. Для примера я написал запрос:

select * from students s
where s.group_id = decode( :group_id , null, d.group_id , :group_id)
and s.students_id= :students_id

Мне нужно его изменить так чтобы, если students_id не удалось найти в группе group_id запрос вернул запись с любым group_id. Или мне придется писать функцию которая будет два раза выполнять запрос?


Ответы (1 шт):

Автор решения: Akina

По-моему, так:

select * 
from students s
where s.students_id= :students_id 
ORDER BY CASE WHEN s.group_id = decode( :group_id , null, d.group_id , :group_id)
              THEN 1 
              ELSE 2 
              END
FETCH FIRST 1 ROW WITH TIES

Сортировка (вернее, выражение сортировки) разделит набор без условия на 2 группы - записи, соответствующие условию, и остальные.

FETCH FIRST 1 ROW отберёт только самую первую запись. А WITH TIES обеспечит отбор всех остальных записей, у которых критерий сортировки совпадает с таковым у первой записи. Т.е. если есть хоть одна запись, соответствующая условию - вернутся все записи, ему соответствующие, иначе вернутся все не соответствующие.


Если же нужна всегда только одна запись - при наличии с требуемой группой, иначе с любой, то просто убрать WITH TIES. Если же при отсутствии всё же есть какие-то приоритеты - добавьте второй уровень сортировки.

→ Ссылка