Мне нужно отфильтровать мою таблицу задач несколькими условиями.
select * from tasks where initialPrice > 20 where status = 3
Но если эти задачи относятся к userId = 1 (например) - мне нужно выбрать его с другими дополнительными статусами (со статусом = 1 и статусом = 5). Поэтому мой вариант:
select * from tasks where initialPrice > 20 and status = 3 or (status = 1 or status = 5 and userId = 5 and initialPrice > 20)
Можно ли избежать дублирования условий и как лучше всего построить этот запрос?
PS В дальнейшем этот запрос будет использоваться с несколькими объединениями, и будет трудно дублировать объединения и условия в обеих частях этого запроса.
Попробуй это
select * from tasks
where initialPrice > 20
and case when status = 3 Then 1 when status in (1,5) and userId = 5 Then 1 else 0 end = 1
Использование выражений case
в предложении where
обычно не рекомендуется. Одна из причин заключается в том, что это затрудняет оптимизацию запроса. Вторая причина заключается в том, что ограничение таких условий логической логикой легче понять людям.
Итак, я бы предложил:
select t.*
from tasks t
where initialPrice > 20 and status = 3 and
(userId <> 1 or status in (1, 5);
или же:
select t.*
from tasks t
where initialPrice > 20 and
(user = 1 and status in (1, 3, 5) or
user <> 1 and status = 3
)