如何在 PostgreSQL 中进行完全匹配后跟 ORDER BY

How to do an exact match followed by ORDER BY in PostgreSQL

我正在尝试编写一个查询,将一些结果(在我的例子中是单个结果)放在顶部,然后对其余结果进行排序。我还没有找到 PostgreSQL 解决方案。

假设我有一个叫 airports 的 table。

 id | code |        display_name         
----+------+----------------------------
  1 | SDF  | International               
  2 | INT  | International Airport       
  3 | TES  | Test                        
  4 | APP  | Airport Place International

简而言之,当用户文本通过 codedisplay_name 搜索机场时,我在控制器方法中有一个查询被异步调用。但是,当用户键入与 code 完全匹配的输入(机场代码是唯一的)时,我希望该结果首先出现,并且所有在 [=16= 中也有 int 的机场] 之后按升序显示。如果没有完全匹配,它应该 return 任何通配符匹配按 display_name 升序排序。因此,如果用户输入 INT,行 (2, INT, International Airport) 应该首先被 returned,然后是其他行:

Results:
1. INT | International Airport
2. APP | Airport Place International
3. SDF | International

这是我正在修改的查询类型,它被稍微简化以在我的应用程序上下文之外有意义,但仍然是相同的概念。

SELECT * FROM airports
WHERE display_name LIKE 'somesearchtext%'
ORDER BY (CASE WHEN a.code = 'somesearchtext` THEN a.code ELSE a.display_name END)

现在,如果我输入 INT 的结果,我会得到

Results:
1. APP | Airport Place International
2. INT | International Airport
3. SDF | International

我的 ORDER BY 一定是不正确的,但我似乎无法理解 任何帮助将不胜感激:)

如果您首先想要 code 与 return 完全匹配,那么我认为这可以解决问题:

SELECT a.*
FROM airports a
WHERE a.display_name LIKE 'somesearchtext%'
ORDER BY (CASE WHEN a.code = 'somesearchtext' THEN 1 ELSE 2 END),
         a.display_name

你也可以这样写:

ORDER BY (a.code = 'somesearchtext') DESC, a.display_name

这不是标准的 SQL,但可读性很好。

我认为您可以通过使用 UNION 来实现您的目标。 首先获得完全匹配,然后将该结果添加到其余数据中。

例如..(你需要在这方面做一些工作)

SELECT * FROM airports
WHERE code == 'somesearchtext'
ORDER BY display_name 

UNION

SELECT * FROM airports
WHERE code != 'somesearchtext' AND display_name LIKE 'somesearchtext%'
ORDER BY display_name