微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL:使用 BIT VARYING 列进行位掩码操作

如何解决PostgreSQL:使用 BIT VARYING 列进行位掩码操作

作为 C 程序员多年来一直使用位掩码,我试图在 Postgres 中做类似的事情,但它没有按我预期的那样工作。所以这是一个包含 2 列的表定义:

    dummy 
    ( 
        countrymask  BIT varying (255) not null,-- Yes it's a pretty wide bitmask
        countryname  CHaraCTER varying NOT NULL,);

因此,“虚拟”表中的一些数据将是:

enter image description here

现在,使用掩码通过一次选择返回阿尔巴尼亚、亚美尼亚和白俄罗斯的 sql 是什么?? (即'100010001')

我以为会是这样:

SELECT * FROM DUMMY WHERE (countrymask & (b'100010001')) <> 0;

但是我遇到了类型不匹配的问题......我希望得到一些帮助。 但是,当类型转换被整理出来时,这会起作用吗?

解决方法

您必须始终使用相同长度的位串,即 bit(255),并存储所有前导零。

如果你可以使用整数,这会更简单

WHERE countrymask & 273 <> 0

但是没有支持 & 运算符的 255 位整数类型。

无论如何,这样的查询永远不能使用索引,这对于像 dummy 这样的小表没有问题,但如果你想扫描更大的表可能会出现问题。

在某种程度上,该数据模型违反了第一范式,因为它在单个数据中存储了多个国家/地区代码。我认为你会更喜欢经典的关系模型:有一个国家表,它有一个用序列填充的数字主键,并使用映射表将另一个表中的行与多个国家相关联。

另一种方法是将行的国家/地区存储为国家/地区标识符数组 (bigint[])。然后,您可以使用“重叠”运算符 && 来扫描表以查找在给定数组中包含任何国家/地区的行。这样的操作can be made fast with a GIN index

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。