2016-12-13 2 views
1

заимствование из this question, скажем, есть три флага: 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 

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

ответ

2

Вы можете использовать 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; 
Смежные вопросы