首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL中使用位字符串(而不是整型)匹配位掩码

在SQL中使用位字符串(而不是整型)匹配位掩码
EN

Stack Overflow用户
提问于 2013-01-08 00:57:52
回答 1查看 8.4K关注 0票数 4

我在这里找到了一个很好的资源( Comparing two bitmasks in SQL to see if any of the bits match ),用于在SQL数据库中进行搜索,您可以使用位掩码存储具有多个属性的数据。不过,在本例中,所有数据都存储为int类型,where子句似乎只适用于int类型。

有没有一种简单的方法可以将非常相似的测试用例转换为使用完整的位串?因此,不是像这样的例子:

代码语言:javascript
运行
复制
with test (id, username, roles)
AS
(
    SELECT 1,'Dave',1
    UNION SELECT 2,'Charlie',3
    UNION SELECT 3,'Susan',5
    UNION SELECT 4,'Nick',2
)
select * from test where (roles & 7) != 0 

取而代之的是这样的东西:

代码语言:javascript
运行
复制
with test (id, username, roles)
AS
(
    SELECT 1,'Dave',B'001'
    UNION SELECT 2,'Charlie',B'011'
    UNION SELECT 3,'Susan',B'101'
    UNION SELECT 4,'Nick',B'110'
)
select * from test where (roles & B'001') != 0 

我可以来回转换,但用实际的位串更容易可视化。对于我的简单转换(如上),我得到了一个错误,运算符不适用于位串。有没有另一种方法可以设置它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-08 05:25:21

一种方法是在表达式的右侧也使用bit string

代码语言:javascript
运行
复制
WITH test (id, username, roles) AS (
   VALUES
     (1,'Dave',B'001')
    ,(2,'Charlie',B'011')
    ,(3,'Susan',B'101')
    ,(4,'Nick',B'110')
   )
SELECT *, (roles & B'001') AS intersection
FROM   test
WHERE  (roles & B'001') <> B'000';

或者,您可以将integer 0转换为bit(3)

代码语言:javascript
运行
复制
...
WHERE  (roles & B'001') <> 0::bit(3);

您可能会对此相关答案感兴趣,该答案演示了在booleanbit stringinteger之间进行转换的多种方法

Can I convert a bunch of boolean columns to a single bitmap in PostgreSQL?

请注意,将数据存储为integer可以节省一些空间。integer需要4字节来存储最多32位的信息,而-I引用manual at said location

位字符串值要求为每组8位使用1字节加上5或8字节开销,具体取决于字符串的长度...

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14200486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档