Postgres - 如何使用或在查询中按巧合排序/排名

时间:2013-01-29 20:30:05

标签: sql postgresql

当我执行以下查询时

select * from table where c2 = 11 or c3 = 15 or c7 = false

我收到了这个结果

| c1 | c2 | c3 | c4  | c5  | c6      | c7     | c8        |
| 24 | 11 | 15 | NNN | NNN |         | true   | false     |
| 28 | 11 | 13 | NNN | NNN |         | true   | false     |
| 26 | 11 | 15 | NNN | NNN | wwwww   | false  | false     |
| 25 | 11 | 2  | NNN | NNN | qqqq    | false  | false     |
| 33 | 23 | 31 | NNN | NNN |         | false  | false     |
| 31 | 23 | 15 | NNN | NNN |         | false  | false     |
| 31 | 23 | 15 | NNN | NNN |         | true   | false     |
| 25 | 11 | 23 | NNN | NNN | qqqqw2  | false  | false     |
| 29 | 11 | 22 | NNN | NNN |         | true   | false     |

我试图通过搜索巧合来命令这个,比如:

| c1 | c2 | c3 | c4  | c5  | c6      | c7    | c8        |
| 26 |[11]|[15]| NNN | NNN | wwwww   |[false]| false     |
| 24 |[11]|[15]| NNN | NNN |         | true  | false     |
| 25 |[11]| 2  | NNN | NNN | qqqq    |[false]| false     |
| 31 | 23 |[15]| NNN | NNN |         |[false]| false     |
| 25 |[11]| 23 | NNN | NNN | qqqqw2  |[false]| false     |
| 28 |[11]| 13 | NNN | NNN |         | true  | false     |
| 29 |[11]| 22 | NNN | NNN |         | true  | false     |
| 31 | 23 |[15]| NNN | NNN |         | true  | false     |
| 33 | 23 | 31 | NNN | NNN |         |[false]| false     |

因此,具有3个选项的行将位于顶部 那么匹配至少2个选项的所有行(没有特定的顺序) 并且最后匹配1个选项的所有行

有没有办法实现这个订单?因为我有另一个选项是使用和语句组合选项然后使用union和所有结果,但它似乎更多

提前致谢

2 个答案:

答案 0 :(得分:1)

您需要添加order by子句:

order by (case when c2 = 11 then 1 else 0 end) +
         (case when c3 = 15 then 1 else 0 end) +
         (case when c7 = false then 1 else 0 end) desc

SQL Fiddle example

答案 1 :(得分:1)

order by
    (c2 = 11)::integer + (c3 = 15)::integer + (not c7)::integer desc

Stealing from @Gordon's example