Упорядочение в SQL при использовании логических операторов
Я пытаюсь написать запрос SQL с оператором "ИЛИ". Дело в том, что я хочу, чтобы он работал с некоторыми, скажем, "приоритетами". У меня есть объект Entity, у него есть два поля, которые я использую в поиске:
- описание
- заглавие
И есть запрос SQL:
select * from item
where description like '%a%' or title like '%a%';
Я хочу, чтобы здесь было возвращено две сущности, и одна из них совпадает с "% a%" по описанию, а другая - по заголовку, и та, которая соответствует заголовку, должна быть первой в списке. Другими словами, это должно иметь больший приоритет. Есть ли способ, которым я могу описать такую цель в SQL?
Диалект: Oracle / H2
1 ответ
Решение
В Oracle вы можете использовать CASE
упорядочить по значениям, которые упорядочивают строки в соответствии с вашими условиями:
/* test case */
with item(title, description) as (
select '__x__', '__x__' from dual union all
select '__x__', '__a__' from dual union all
select '__a__', '__x__' from dual union all
select '__a__', '__a__' from dual
)
/* the query */
select *
from item
where description like '%a%' or title like '%a%'
order by case
when title like '%a%'
then 1
else 2
end
Это дает:
TITLE DESCR
----- -----
__a__ __x__
__a__ __a__
__x__ __a__