Упорядочение в 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__
Другие вопросы по тегам