UNION查询所需的订单

时间:2018-05-30 21:52:47

标签: sql postgresql

我使用Postgres并假设我有一个像这样的简单表

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

我想找到与模式完全或部分匹配的所有城市。重要的是,完全匹配的城市应该是结果中的第一个。例如,如果我找到#34; 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 :(得分:2)

您可以使用order by

SELECT *
FROM cities
WHERE name ~* 'San|Francisco'
ORDER BY (name = 'San Francisco')::int DESC;
此查询不需要

UNION / UNION ALL