Создать пользовательский столбец в операторе 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
,