Как лучше всего выполнить группировку в "битовом поле"?

Исходя из этого вопроса, скажем, есть три флага: 4 => чтение, 2 => запись, 1 => выполнение, и таблица выглядит следующим образом:

  file_id  |  fsize  |  permissions
-----------+---------+---------------
        1  |  200    |  6    ( <-- 6 = 4 + 2 = read + write)
        2  |  300    |  4    ( <-- 4 = 4 = read)
        3  |  400    |  3    ( <-- 3 = 2 + 1 = write + execute)
        4  |  500    |  1    ( <-- 1 = execute)

Учитывая, что это поле может содержать несколько флагов, мне нужно вернуть результат, сгруппированный по этим трем флагам, что-то вроде этого:

 |  fsize  |  permissions
 +---------+---------------
 |  900    |  1    
 |  600    |  2    
 |  500    |  4

Каков наилучший способ сделать это?

1 ответ

Решение

Вы можете использовать join за это:

select p.permission, sum(fsize)
from t join
     (select 1 as permission union all
      select 2 union all
      select 4
     ) p
     on p.permission & t.permissions > 0
group by p.permission
order by p.permission;
Другие вопросы по тегам