1

次のクエリを実行すると

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 つのオプションに一致するすべての行が表示されます。

この順序を達成する方法はありますか?私が持っている他のオプションは、andステートメントでオプションを組み合わせてから、すべての結果でユニオンを使用することですが、それはもっと多いようです

前もって感謝します

4

2 に答える 2

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 フィドルの例)

于 2013-01-29T20:35:43.277 に答える
1
order by
    (c2 = 11)::integer + (c3 = 15)::integer + (not c7)::integer desc

@Gordonの例から盗む

于 2013-01-29T21:28:31.323 に答える