Битовые операции над MAC-адресами в PostgreSQL

Мне нужно выполнить определенные побитовые сравнения MAC-адресов, которые я сохранил в PostgreSQL как macaddr, но, насколько я могу судить, нет ничего, что позволило бы мне это сделать (за исключением разбора строки MAC в шестнадцатеричное число, которое кажется будет не очень эффектно).

Есть ли в PostgreSQL способ эффективно проводить такое сравнение или эффективно преобразовывать MAC-адреса в числовое или битовое представление, которое затем можно было бы сравнивать?

Следующее работает, но для этого требуется немало манипуляций со строками:

select ('x'||replace(macaddr_field::varchar,':',''))::bit(48);


person M. Justin    schedule 16.10.2017    source источник


Ответы (1)


https://www.postgresql.org/docs/current/static/functions-net.html

Тип macaddr также поддерживает стандартные операторы отношения (>, ‹= и т. д.) для лексикографического упорядочения и побитовые арифметические операторы (~, & и |) для НЕ, И и ИЛИ.

это ваши ограничения для побитовых операций с macaddr, например:

t=# with mac(a,b) as
(values('01:00:00:ff:aa:78'::macaddr,'0e:7e:e9:f0:fa:80'::macaddr))
select a|b, ~ a, a&b, a <= b  from mac;
     ?column?      |     ?column?      |     ?column?      | ?column?
-------------------+-------------------+-------------------+----------
 0f:7e:e9:ff:fa:f8 | fe:ff:ff:00:55:87 | 00:00:00:f0:aa:00 | t
(1 row)

работает так, как было обещано, и вам не нужно приводить macaddr к bit, остальное зависит от того, какое сравнение вы хотите выполнить

person Vao Tsun    schedule 17.10.2017