2017-07-31 40 views
0

我试图编写一个查询,在顶部放置一些结果(在我的情况下为单个结果),然后对其余的结果进行排序。我还没有找到PostgreSQL解决方案。如何在PostgreSQL中执行完全匹配,然后是ORDER BY

说我有一个叫做airports的表。

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

总之,我有一个控制器方法的查询被异步调用时机场用户文本搜索或者通过codedisplay_name。但是,当用户输入与code准确匹配的输入(机场代码是唯一的)时,我希望首先显示该结果,并且之后将按升序显示intdisplay_name)中的所有机场。如果没有完全匹配,则应返回按display_name排序的任何通配符匹配。因此,如果用户键入INT,该行(2, INT, International Airport)应先返回,随后其他人:

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必须是不正确的,但我似乎无法得到它 任何帮助将不胜感激:)

回答

1

如果你想要在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 

你也可以这样写:

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

这不是标准的SQL,但它是相当可读。

+0

注意你并不需要如此。由于“=”在FALSE之后返回一个布尔值和TRUE排序,所以可以执行“ORDER BY a.code ='yourvalue'DESC,a.display_name” – peufeu

0

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

e.g ..(你需要在这一点工作)

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 
相关问题