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

ElG*_*abe 2 sql postgresql sql-order-by case-when columnsorting

我正在尝试编写一个查询,该查询将一些结果(在我的情况下为单个结果)放在顶部,然后对其余结果进行排序。我尚未找到PostgreSQL解决方案。

说我有一个airports像这样的桌子。

 id | code |        display_name         
----+------+----------------------------
  1 | SDF  | International               
  2 | INT  | International Airport       
  3 | TES  | Test                        
  4 | APP  | Airport Place International
Run Code Online (Sandbox Code Playgroud)

简而言之,我在控制器方法中有一个查询,当用户文本通过code或搜索机场时,该查询将被异步调用display_name。但是,当用户输入的输入code完全匹配时(机场代码是唯一的),我希望该结果首先出现,然后所有int在其中也要display_name升序显示的机场。如果不存在完全匹配项,则应返回所有按display_name升序排序的通配符匹配项。因此,如果用户输入INT(2, INT, International Airport)则应首先返回该行,然后再返回其他行:

Results:
1. INT | International Airport
2. APP | Airport Place International
3. SDF | International
Run Code Online (Sandbox Code Playgroud)

这是我正在修改的查询的一种,它在我的应用程序上下文之外进行了稍微简化以使其有意义,但是仍然具有相同的概念。

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

现在,如果输入,结果INT就是

Results:
1. APP | Airport Place International
2. INT | International Airport
3. SDF | International
Run Code Online (Sandbox Code Playgroud)

ORDER BY必须是不正确的,但我似乎无法得到它。任何帮助将不胜感激:)

Gor*_*off 7

如果您希望完全匹配code首先返回,那么我认为这可以解决问题:

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
Run Code Online (Sandbox Code Playgroud)

您也可以这样写:

ORDER BY (a.code = 'somesearchtext') DESC, a.display_name
Run Code Online (Sandbox Code Playgroud)

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