Postgres中的位屏蔽

时间:2010-02-01 21:39:25

标签: postgresql bitwise-operators

我有这个查询

SELECT * FROM "functions" WHERE (models_mask & 1 > 0)

我收到以下错误:

  

PGError:ERROR:运算符不存在:字符变化&整数
  提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

models_mask是数据库中的整数。我该如何解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:12)

查看docs on bit operators的Pg。

基本上&只适用于两种类似的类型(通常是bit或int),因此model_mask必须从varchar CAST编译为像bit或int这样合理的东西:

models_mask::int & 1 -or - models_mask::int::bit & b'1'

您可以使用\doS

中的psql找出运营商使用的类型
pg_catalog | &    | bigint                      | bigint                      | bigint                      | bitwise and
pg_catalog | &    | bit                         | bit                         | bit                         | bitwise and
pg_catalog | &    | inet                        | inet                        | inet                        | bitwise and
pg_catalog | &    | integer                     | integer                     | integer                     | bitwise and
pg_catalog | &    | smallint                    | smallint                    | smallint                    | bitwise and

以下是更多信息的快速示例

# SELECT 11 & 15 AS int, b'1011' & b'1111' AS bin INTO foo;
SELECT

# \d foo
      Table "public.foo"
 Column |  Type   | Modifiers 
--------+---------+-----------
 int    | integer | 
 bin    | "bit"   | 

# SELECT * FROM foo;
 int | bin  
-----+------
  11 | 1011