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