Создать пользовательский столбец в операторе SELECT только для сортировки, а НЕ ПОКАЗАТЬ его в результате в SQLite?

Вот мой запрос:

SELECT name, 1 as rank
FROM names
WHERE name LIKE '%abc%'
UNION
SELECT name, 2 as rank
FROM names
WHERE name LIKE '%xyz%'
ORDER BY rank

Проблема в том, что повторяющиеся строки не будут объединяться в UNION, поскольку они будут отличаться в столбце ранга. Теперь, как мне скрыть пользовательский ранг столбца, но все равно использовать его в предложении ORDER BY? Спасибо.

РЕДАКТИРОВАТЬ:

Я на самом деле пытаюсь отсортировать по релевантности, например, целые слова && точная фраза сначала, целые слова && не точное второе, не целое && не точное третье и т. Д.

2 ответа

Решение

Попробуйте не комбинировать с union, но вместо этого используйте оператор case. Это позволяет избежать дублирования проблемы.

Select name from
(Select name , 
Case when name like '%abc%' then 1 else 2 end as rank
 From names
Where name like '%and%' or name like '%xyz%' 
Order by rank)
Group By name;

Похоже, вы хотите выбрать все имена с 'abc' из имен, а затем выберите имена с помощью 'xyz'.

В этом запросе что-либо с 'abc' оценивается как 1, а что-нибудь с 'xyz' (но не с 'abc') оценивается как 2.

В нашем предложении where мы выбираем только имена с "abc" или "xyz". Случай применяет 1 к 'abc', и все остальные строки (только 'xyz') получают 2. Порядок должен теперь работать без дублирования

Забудь union и подзапросы. Просто делать:

select name
from names
where name like '%abc%' or name like '%xyz%'
order by (case when name like '%abc%' then 1
               when name like '%xyz%' then 2
               else 3
          end);

Примечание. Если вас беспокоят дубликаты, вы можете использовать select distinct name,

Другие вопросы по тегам