我有一个数据库,其权限编码为二进制标志存储在 postgres 的 smallint 中。 这意味着我可以在一列中有 2、4、8、16 或 12 个。 现在,如果我对该列“排序依据”,即使 12 中有两个 1 而 16 只有一个 1(01100 对 10000),16 将被视为高于 12。
如果您将 1 视为权限页面上的已选中复选框,将 0 视为未选中复选框,则 12 有两次检查,而 16 只有一次检查。 我想按支票最多的日期排序。
是否有可能以某种方式按二进制中 1 的个数排序?
最佳答案
如果将值转换为 bit
数据类型,然后将其转换为字符串。如果你从字符串中删除零,你可以按字符串的长度排序。
order by length(replace(permissions::bit(8)::text, '0', ''))
假设您使用的是 8 位,否则请更改转换。
with data (permissions) as (
values
(12),
(0),
(16),
(4)
)
select permissions::bit(8) as bits, permissions
from data
order by length(replace(permissions::bit(8)::text, '0', ''))
将返回:
bits | permissions
---------+------------
00000000 | 0
00010000 | 16
00000100 | 4
00001100 | 12
您需要决定如何对具有相同位数的值进行排序(上例中为 16 位和 4 位),例如通过添加另一个排序列作为决胜局
关于postgresql - 按二进制排序(二进制中的个数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32179095/