Битовая маскировка в Постгресе - PullRequest
5 голосов
/ 02 февраля 2010

У меня есть этот запрос

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

и я получаю следующую ошибку:

PGError: ОШИБКА: оператор не существует: символ меняется & целое число
СОВЕТ: ни один оператор не соответствует заданному имени и типу (аргументам) аргумента. Возможно, вам потребуется добавить явные приведения типов.

models_mask - это целое число в базе данных. Как я могу это исправить.

Спасибо!

1 Ответ

12 голосов
/ 02 февраля 2010

Ознакомьтесь с документами для битовых операторов для Pg.

По существу & работает только для двух одинаковых типов (обычно bit или int), поэтому model_mask нужно будет CAST преобразовать из varchar во что-то разумное, например, bit или int:

models_mask::int & 1 -или - 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
...