Как лучше всего выполнить группировку в "битовом поле"?
Исходя из этого вопроса, скажем, есть три флага: 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;