テーブルにビット単位のフラグを含むフィールドがあります。例として、3つのフラグがあるとしましょう。4 => read, 2 => write, 1 => execute
テーブルは次のようになります*
。
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)
任意のレコードに特定のフラグが設定されている(例:書き込み)すべてのユーザーを見つけることに興味があります。1つのクエリでこれを行うために、すべてのユーザーのアクセス許可をORすると、ユーザーのアクセス許可の「合計」である単一の値が得られると考えました。
user_id | all_perms
-----------+-------------
1 | 6 (<-- 6 | 4 = 6)
2 | 5 (<-- 4 | 1 = 5)
*
私の実際のテーブルは、ファイルやファイルのパーミッションとは関係ありません。
これを1つのステートメントで実行する方法はありますか?私の見方では、GROUPBYを使用した通常の集計関数と非常によく似ています。
SELECT user_id, SUM(permissions) as all_perms
FROM permissions
GROUP BY user_id
...しかし、明らかに、SUMの代わりにいくつかの魔法の「ビット単位」関数があります。誰かそのようなことを知っていますか?
(ボーナスポイントについては、オラクルで機能しますか?)