我正在使用Postgres,假设我有一个简单的表,如下所示
cities
------------------
id | name
------------------
1 | San Diego
------------------
2 | San Antonio
------------------
3 | Stockholm
------------------
4 | Helsinki
------------------
5 | San Francisco
------------------
我希望找到与该模式完全或部分匹配的所有城市。重要的是,精确匹配的城市应该是结果中的第一个。例如,如果我在"San Francisco“中找到city,结果应该是这样的
-------------------
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
但在这种情况下,我不能轻易删除重复的城市和“旧金山”将被打印两次。我相信可以编写非常简单的查询来解决这个任务。
发布于 2018-05-31 05:55:09
您可以使用order by
SELECT *
FROM cities
WHERE name ~* 'San|Francisco'
ORDER BY (name = 'San Francisco')::int DESC;
此查询不需要UNION
/UNION ALL
。
https://stackoverflow.com/questions/50613841
复制相似问题