2010-08-02 2 views
0

У меня есть таблица в MySQL, которая хранит (среди других столбцов) битовая маска в виде строки, например:Как сравнить (AND) две строки, которые представляют собой двоичную маску в mysql?

000100

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

В качестве примера, рассмотрим эти три образца записи:

id name mask 
== ==== ==== 
11 a  000100 
12 a  000110 
13 a  010000 

Этот запрос автообъединение. Я ищу записи, где для заданного name одна и та же битмаска выполняется дважды или более.

В приведенном выше примере единственными записями, которые соответствуют этому условию, являются 11 и 12 (четвертый бит равен 1 в обоих случаях).

Проблема, которую я испытываю, выполняет AND на маске. Поскольку он хранится как строка, я не уверен, как заставить mysql рассматривать его как двоичное значение.

ответ

3

Вы можете использовать conv, например.

select conv('1100', 2, 10) & conv('0110', 2, 10); 

Re комментарий, кажется, работает для меня:

mysql> select conv('1001', 2, 10) & conv('0110', 2, 10) = 0; 
+-----------------------------------------------+ 
| conv('1001', 2, 10) & conv('0110', 2, 10) = 0 | 
+-----------------------------------------------+ 
|            1 | 
+-----------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select conv('1001', 2, 10) & conv('0111', 2, 10) = 0; 
+-----------------------------------------------+ 
| conv('1001', 2, 10) & conv('0111', 2, 10) = 0 | 
+-----------------------------------------------+ 
|            0 | 
+-----------------------------------------------+ 
1 row in set (0.00 sec) 
+0

ли вы имеете в виду 'выберите Коэфф ('1100', 2, 10) && конв ('0110', 2, 10); '(двойной амперсанд вместо одиночного)? Однако даже с этой коррекцией он все еще не работает как 'select conv ('1001', 2, 10) && conv ('0110', 2, 10);' должен оцениваться как false, но он оценивается как true. – JYelton

+0

Интересно, используя только один амперсанд, работает согласно вашему правлению. По-видимому, это побитовое 'AND', тогда как двойной амперсанд - логический' AND' - извините, я неправильно прочитал документацию по этому поводу! – JYelton

+0

@ar: вы действительно копируете, удалили мой ответ. Просто добавление: при сравнении с фиксированным битом можно использовать нечто вроде 'b'0110'' вместо' conv ('0110', 2,10) ', но это будет работать только для литералов, а не для имен полей. – Wrikken

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