Разбить битовую маску в SQL - PullRequest
0 голосов
/ 31 января 2020

У меня есть старый дизайн базы данных, с которым я работаю, использующий битовые маски. У меня есть таблица с адресами электронной почты и битовой маской на основе другой таблицы, и мне было поручено написать запрос SQL, который «разбивает» эти битовые маски. Как правило, эти данные просматриваются по-разному, где мы используем побитовое и определить, действительна ли битовая маска, но на этот раз это не так ...

В упрощенной версии моих данных я имею 2 поля примерно так.

|---------------------|------------------|
|      Email          |     bitMask      |
|---------------------|------------------|
|     test@test.com   |        3         |
|---------------------|------------------|
|    test2@test.com   |        9         |
|---------------------|------------------| 

Вывод, который я в конечном итоге ищу, покажет, какие "степени 2" или какие "биты" потребуются, чтобы получить битовую маску, чтобы я мог дать перекрестную ссылку значения маски в другой таблице. Итак, мой пример вывода выглядит примерно так:

|---------------------|------------------|
|      Email          |     value        |
|---------------------|------------------|
|     test@test.com   |        2         |
|---------------------|------------------|
|     test@test.com   |        1         |
|---------------------|------------------|
|    test2@test.com   |        8         |
|---------------------|------------------| 
|    test2@test.com   |        1         |
|---------------------|------------------| 

Это противоположный способ, которым я привык иметь дело с битовыми масками. Если кто-нибудь знает, как go написать этот запрос, любой совет приветствуется.

1 Ответ

2 голосов
/ 31 января 2020

Используйте & (битовый оператор AND), с 0xFFFFFFFE для получения степеней 2 части и с 1 для получения 1-го двоичного ди git (0 или *) 1007 *):

select [Email], [bitMask] & 0xFFFFFFFE [value]
from tablename  
union all
select [Email], [bitMask] & 1
from tablename  
order by [Email], [value] desc

См. Демоверсию . Результаты:

> Email          | value
> :------------- | ----:
> test@test.com  |     2
> test@test.com  |     1
> test2@test.com |     8
> test2@test.com |     1
...