Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有所需顺序的联合查询_Sql_Postgresql - Fatal编程技术网

Sql 具有所需顺序的联合查询

Sql 具有所需顺序的联合查询,sql,postgresql,Sql,Postgresql,我正在使用Postgres,假设我有一个这样的简单表 cities ------------------ id | name ------------------ 1 | San Diego ------------------ 2 | San Antonio ------------------ 3 | Stockholm ------------------ 4 | Helsinki ------------------ 5 | San Francisco ------------

我正在使用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"
我想找到所有完全或部分符合该模式的城市。重要的是,精确匹配的城市应该是结果的第一位。例如,如果我为“旧金山”找到城市,结果应该是这样的

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"
重要的是,“旧金山”是结果中的第一个

我的问题是这样的

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"
但是这个查询不能保证所需的顺序。我尝试使用分区添加行号()并按其排序

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

但在这种情况下,我不能轻易地删除重复的城市和“旧金山”将打印两次。我相信可以编写非常简单的查询来解决此任务。

您可以使用
order by

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

UNION
/
此查询不需要UNION ALL

您可以使用
order by

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