按二进制排序(二进制中的1的数量)

时间:2015-08-24 09:42:26

标签: postgresql

我有一个数据库,其权限编码为二进制标志,存储在postgres中的smallint中。 这意味着我可以在一列中有2,4,8,16或12。 现在,如果我按'在第16列上排序'将被认为高于12,即使12中有两个1,而16只有1个(01100对10000)。

如果您认为权限页面上的1为复选复选框,而未选中复选框则为0,则12有两个检查,16只有一个检查。 我希望用大多数支票进行排序。

是否有可能以某种方式按二进制数1进行排序?

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)