Я использую Postgres 9.6, и у меня есть запрос, который показывает первые 100 строк, которые содержат конкретную строку, в данном примере «xyz».Это выглядит примерно так:
SELECT name FROM data WHERE name ILIKE '%xyz%' ORDER BY other_column LIMIT 100;
Чего я на самом деле хочу добиться, так это поместить строки, совпадающие в начале столбца имени, впереди.Таким образом, всего 100 строк, но сначала они были заполнены результатами, соответствующими name ILIKE 'xyz%
, а затем результатами ILIKE '%xyz%'
.
. Я пытался добиться этого с помощью запросов UNION, примерно как следующие
SELECT name FROM data WHERE name ILIKE 'xyz%'
UNION
SELECT name FROM data WHERE name ILIKE '%xyz%'
ORDER BY other_column
LIMIT 100;
Это, очевидно, не работает, потому что оно отсортировано по other_column
.Моя первоначальная идея состояла в том, чтобы добавить столбец к каждому запросу, чтобы использовать его для сортировки
SELECT 1 as sort_order, name FROM data WHERE name ILIKE 'xyz%'
UNION
SELECT 2 as sort_order, name FROM data WHERE name ILIKE '%xyz%'
ORDER BY sort_order, other_column
LIMIT 100;
Но это убивает повторное удаление UNION
и вместо этого ведет себя как UNION ALL
, потому что я делаю первоначально идентичные строки разнымис добавлением столбца sort_order.
Конечно, я мог бы удалить дубликаты на более позднем этапе вне базы данных, но это не очень привлекательное для меня решение.Есть ли способ заказать отдельные части запроса UNION отдельно и добиться результатов, которые я описал?