当我执行以下查询时
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和所有结果,但它似乎更多
提前致谢
答案 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
答案 1 :(得分:1)
order by
(c2 = 11)::integer + (c3 = 15)::integer + (not c7)::integer desc