Czy możliwe jest wykonanie funkcji grupy bitowej?
Mam pole w tabeli, które zawiera flagi bitowe. Powiedzmy na przykład, że są trzy flagi:4 => read, 2 => write, 1 => execute
a stół wygląda tak*
:
user_id | file | permissions
-----------+--------+---------------
1 | a.txt | 6 ( <-- 6 = 4 + 2 = read + write)
1 | b.txt | 4 ( <-- 4 = 4 = read)
2 | a.txt | 4
2 | c.exe | 1 ( <-- 1 = execute)
Jestem zainteresowany znalezieniem wszystkich użytkowników, którzy mają określony zestaw flag (np .: napisz) w DOWOLNYM rekordzie. Aby to zrobić w jednym zapytaniu, doszedłem do wniosku, że gdybyś LUB LUBI wszystkie uprawnienia użytkownika razem, otrzymasz jedną wartość, która jest „sumą całkowitą” ich uprawnień:
user_id | all_perms
-----------+-------------
1 | 6 (<-- 6 | 4 = 6)
2 | 5 (<-- 4 | 1 = 5)
*
Moja rzeczywista tabela nie dotyczy plików ani uprawnień do plików, ale to tylko przykład
Czy jest jakiś sposób, żeby to zrobić w jednym stwierdzeniu? Sposób, w jaki to widzę, jest bardzo podobny do zwykłej funkcji agregującej z GROUP BY:
SELECT user_id, SUM(permissions) as all_perms
FROM permissions
GROUP BY user_id
... ale oczywiście, magiczna funkcja "bitwise-or" zamiast SUM. Ktoś wie o czymś takim?
(A dla punktów bonusowych, czy to działa w wyroczni?)