前提:  已知的一组结果集

待解决问题:

  1. 在公司列表页面,把一些特定公司的显示在最前面
  2. 给定一批公司编号,需要按照给定编号进行排序

经过 Google 和查看 PostgreSQL Document 后,找到一个比较好的解决方案,可以使用 array_position function 来轻松完成此项需求. 

接下来,我们来看看具体如何使用 ARRAY_POSITION function 

场景一: 将公司 (100,43,13,89) 排在列表最前面

SELECT id, ARRAY_POSITION(ARRAY[100, 43, 13, 89], id::integer) AS position from companies ORDER BY position ASC NULLS LAST;

------------------------------------

| id | position |
| 100  | 1 |
| 43  | 2 |
| 13  | 3 |
| 89  | 4 |
| 80  | NULL |
| 40  | NULL |
| 134  | NULL |
| 128  | NULL |
| 149  | NULL |
| 543  | NULL |

从这个查询结果可以看出,排在最面的四个公司正是我们期望看到的结果.

场景二: 按照给定的公司IDs正确排序显示其信息

SELECT id, ARRAY_POSITION(ARRAY[100, 43, 13, 89, 123, 144, 444, 235, 198, 139], id::integer) AS position FROM companies WHERE id IN (100, 43, 13, 89, 123, 144, 444, 235, 198, 139) ORDER BY position ASC NULLS LAST;

------------------------------------

| id | position |
| 100  | 1 |
| 43  | 2 |
| 13  | 3 |
| 89  | 4 |
| 123 | 5 |
| 144 | 6 |
| 444 | 7 |
| 235 | 8 |
| 198 | 9 |
| 139 | 10 |


结论:

对于我的情况,似乎使用array_position是最好的方法,它允许我们在结果集自定义排名规则, 只需要通过简单调整一个SQL查询,便可以轻松实现。

References