PostgreSQL中的长数和按位运算

时间:2018-03-27 10:09:12

标签: postgresql bitwise-operators long-integer bigint

使用PostgreSQL DB的django应用程序 我们的任务是收集和存储MSSQL Server权限(其数量约为120)。它实现为一个长数字,每个位是1个权限 因此,我们需要在PostgreSQL中存储一个很长的数字,但它的MAX数值是64位。这就是我们存储的原因现在是一个字符串。 应用程序创建一个SQL查询,如:

SELECT "mssql_ace"."id", .... "mssql_ace"."permissions",

FROM "mssql_ace"

LEFT OUTER JOIN ... ON ...
...
WHERE (.... AND ("mssql_ace"."permissions" & 1) = 1)

ORDER BY ... ;

现在的问题出在WHERE部分。我们需要按位操作,它是一种通过在整个应用程序中工作的权限来过滤数据的方法,除此之外。我们不能对字符串使用按位运算。

我们尝试在PostgreSQL中进行投射:

  
1. (CAST("mssql_ace"."permissions" AS BIGINT) & 1)

2. "mssql_ace"."permissions"::BIGINT & 1

等等:

3. DECIMAL also doesn't support bitwise

我们有一个想法,将这个大数字分成两部分。但是改变内部应用需要做很多工作。还有其他想法吗?我们不能改变的主要事情是按位操作的使用。

谢谢。

1 个答案:

答案 0 :(得分:1)

我不知道如何在django中集成它,但逻辑PostgreSQL数据类型为bit varying。它允许您有效地存储长位字符串。