如何在 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
简而言之,当用户文本通过 code
或 display_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
我正在尝试编写一个查询,将一些结果(在我的例子中是单个结果)放在顶部,然后对其余结果进行排序。我还没有找到 PostgreSQL 解决方案。
假设我有一个叫 airports
的 table。
id | code | display_name
----+------+----------------------------
1 | SDF | International
2 | INT | International Airport
3 | TES | Test
4 | APP | Airport Place International
简而言之,当用户文本通过 code
或 display_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