Câu trả lời cho câu hỏi của bạn là sử dụng Bitwise &
như thế này:
SELECT * FROM UserTable WHERE Roles & 6 != 0
6
có thể được trao đổi cho bất kỳ sự kết hợp nào của trường bit của bạn mà bạn muốn kiểm tra xem bất kỳ người dùng nào cũng có một hoặc nhiều bit đó. Khi cố gắng xác thực điều này, tôi thường thấy hữu ích khi viết nó ra lâu trong hệ nhị phân. Bảng người dùng của bạn trông giống như sau:
1 2 4
------------------
Dave 0 1 1
Charlie 0 1 0
Susan 0 0 1
Nick 1 0 0
Bài kiểm tra của bạn (6) là cái này
1 2 4
------------------
Test 0 1 1
Nếu chúng ta xem xét từng người thực hiện bitwaise và chống lại bài kiểm tra, chúng ta nhận được những điều này:
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)
Phần trên sẽ chứng minh rằng bất kỳ bản ghi nào mà kết quả không phải là 0 đều có một hoặc nhiều cờ được yêu cầu.
Chỉnh sửa:Đây là trường hợp kiểm tra mà bạn muốn kiểm tra điều này
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
hoặc
select * from test where (roles & 2) != 0 // returns Dave & Charlie
hoặc
select * from test where (roles & 7) != 0 // returns dave, charlie, susan & nick