2010-02-01 3 views
4

У меня есть этот запрос,Бит маскирования в Postgres

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

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

PGError: ERROR: operator does not exist: character varying & integer
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

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

Спасибо!

ответ

10

Отъезд docs on bit operators для Pg.

По существу & работает только на двух одинаковых типов (как правило, немного или целое), поэтому model_mask должны быть CAST ред от VARCHAR к чему-то разумное, как бит или 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 
+0

Отлично! Спасибо за решение и объяснение. –

Смежные вопросы