UNION запрашивает желаемый порядок - PullRequest
0 голосов
/ 31 мая 2018

Я использую Postgres и предположим, что у меня есть простая таблица, подобная этой

cities
------------------
id | name
------------------
 1 | San Diego
------------------
 2 | San Antonio
------------------
 3 | Stockholm
------------------
 4 | Helsinki
------------------
 5 | San Francisco
------------------

Я хотел бы найти все города, которые точно или частично соответствуют шаблону.И важно, что именно подобранный город должен быть первым в результате.Например, если я нахожу город для "Сан-Франциско", результат должен выглядеть следующим образом

 -------------------
 id | name
 -------------------
  5 | San Francisco
 -------------------
  1 | San Diego
 -------------------
  2 | San Antonio
 -------------------

Важно, чтобы "Сан-Франциско" был первым в результате.

Мой запрос выглядитвот так

 SELECT * FROM cities WHERE name = "San Francisco"
 UNION
 SELECT * FROM cities WHERE name ~* "San|Francisco"

Но этот запрос не гарантирует желаемый порядок.Я попытался использовать разделы, чтобы добавить row_number () и упорядочить его.

WITH cities_with_rows_number AS (
   SELECT *, 0 as row_number FROM cities WHERE name = "San Francisco"
   UNION
   SELECT *, row_number() OVER() as row_number FROM cities WHERE name ~* "San|Francisco"
) SELECT * FROM cities_with_rows_number ORDER BY row_number

Но в этом случае я не могу легко выбрать дубликаты городов, и «Сан-Франциско» будет напечатан дважды.Я верю, что можно написать довольно простой запрос для решения этой задачи.

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете использовать order by:

SELECT *
FROM cities
WHERE name ~* 'San|Francisco'
ORDER BY (name = 'San Francisco')::int DESC;

UNION / UNION ALL не требуется для этого запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...