あなたの質問への答えは、ビット単位の&
を使用することです このように:
SELECT * FROM UserTable WHERE Roles & 6 != 0
6
ユーザーがこれらのビットを1つ以上持っていることを確認したい場合は、ビットフィールドの任意の組み合わせと交換できます。これを検証しようとするとき、私は通常、これをバイナリで手書きで書き出すことが役立つと思います。ユーザーテーブルは次のようになります:
1 2 4
------------------
Dave 0 1 1
Charlie 0 1 0
Susan 0 0 1
Nick 1 0 0
あなたのテスト(6)はこれです
1 2 4
------------------
Test 0 1 1
私たちがビットウェイズをしている一人一人を通り抜けると、テストに対して私たちはこれらを得る:
1 2 4
------------------
Dave 0 1 1
Test 0 1 1
Result 0 1 1 (6)
Charlie 0 1 0
Test 0 1 1
Result 0 1 0 (2)
Susan 0 0 1
Test 0 1 1
Result 0 0 1 (4)
Nick 1 0 0
Test 0 1 1
Result 0 0 0 (0)
上記は、結果がゼロではないレコードに1つ以上の要求されたフラグがあることを示しているはずです。
編集:これを確認したい場合のテストケースは次のとおりです
with test (id, username, roles)
AS
(
SELECT 1,'Dave',6
UNION SELECT 2,'Charlie',2
UNION SELECT 3,'Susan',4
UNION SELECT 4,'Nick',1
)
select * from test where (roles & 6) != 0 // returns dave, charlie & susan
または
select * from test where (roles & 2) != 0 // returns Dave & Charlie
または
select * from test where (roles & 7) != 0 // returns dave, charlie, susan & nick