我有一个数据库,其权限编码为二进制标志,存储在postgres中的smallint中。 这意味着我可以在一列中有2,4,8,16或12。 现在,如果我按'在第16列上排序'将被认为高于12,即使12中有两个1,而16只有1个(01100对10000)。
如果您认为权限页面上的1为复选复选框,而未选中复选框则为0,则12有两个检查,16只有一个检查。 我希望用大多数支票进行排序。
是否有可能以某种方式按二进制数1进行排序?
答案 0 :(得分:1)
是的,但会变得非常难看:
CREATE TABLE bits (bits INTEGER NOT NULL);
INSERT into bits(bits) select gs FROM generate_series(0,16) gs;
SELECT bits
FROM bits
ORDER BY (bits & 1 = 1)::integer
+ (bits & 2 = 2)::integer
+ (bits & 4 = 4)::integer
+ (bits & 8 = 8)::integer
+ (bits & 16 = 16)::integer
, bits -- tiebreaker
;
结果:
CREATE TABLE
INSERT 0 17
bits
------
0
1
2
4
8
16
3
5
6
9
10
12
7
11
13
14
15
(17 rows)