postgresql - 按二进制排序(二进制中的个数)

标签 postgresql

我有一个数据库,其权限编码为二进制标志存储在 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/

相关文章:

sql - PostgreSQL 窗口函数 : row_number() over (partition col order by col2)

ruby-on-rails - Ruby on Rails - Postgres : Array value must start with "{" or dimension information

sql - 如何设置 SSIS 以从 Postgres 数据库中提取数据

sql - 如何只更新一定比例的匹配值

postgresql - 如何使用 SSL 将 Google Data Studio 数据源连接到 Azure Postgres

php - PHP 从 Postgres 正确读取数据类型

mysql - 如何使用存储键的表中的 SQL 从键/值字典返回值?

postgresql - Postgres NestJS Prisma 迁移 - 数据库错误代码 : 23502 column of relation contains null values

postgresql - 如何避免 PostgreSQL 触发器中的递归

postgresql - 有 (type_id, element_id) 对,例如 (1,1)、(1,2)、.. (5,3)。如果我需要获取没有 element_id 1 的类型 id,如何从结果中排除 type_id?