É possível executar uma função de grupo bit a bit?

Eu tenho um campo em uma tabela que contém sinalizadores bitwise. Vamos dizer, por exemplo, há três bandeiras:4 => read, 2 => write, 1 => execute e a mesa parece com isso*:

  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)

Estou interessado em encontrar todos os usuários que possuem um sinalizador específico (por exemplo: gravação) em QUALQUER registro. Para fazer isso em uma consulta, imaginei que, se você ORsesse todas as permissões do usuário juntas, você obteria um único valor, que é a "soma total" de suas permissões:

  user_id  |  all_perms
-----------+-------------
        1  |  6        (<-- 6 | 4 = 6)
        2  |  5        (<-- 4 | 1 = 5)

*Minha tabela real não tem a ver com arquivos ou permissões de arquivos, mas é um exemplo

Existe uma maneira que eu poderia realizar isso em uma declaração? Do jeito que eu vejo, é muito semelhante a uma função agregada normal com GROUP BY:

SELECT user_id, SUM(permissions) as all_perms
FROM permissions
GROUP BY user_id

... mas obviamente, alguma função mágica "bitwise-or" em vez de SUM. Alguém sabe de algo assim?

(E para pontos de bônus, funciona em oracle?)

questionAnswers(5)

yourAnswerToTheQuestion