的回答你的問題是使用像這樣的Bitwise &
:
SELECT * FROM UserTable WHERE Roles & 6 != 0
6
可以交換爲您的位域的任何組合,您要檢查任何用戶是否有一個或多個這些位。當試圖驗證這一點時,我通常會發現用二進制編寫這個代碼很有用。你的用戶表看起來像這樣:
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
如果我們通過每個人做的bitwaise和反對的測試中,我們得到這些:
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)
上面應該證明結果不爲零的任何記錄都有一個或多個請求的標誌。
編輯:這裏的測試用例應該要檢查這個
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
&運算符適用於位掩碼與一個角色相比較,但不用於比較位掩碼和其他位掩碼。我想我必須使用動態sql並將每個角色放入where子句中。 – Nick 2008-09-27 15:03:37
@尼克 - 錯 - 請參閱我的回答。 – Jamiec 2012-02-13 15:56:04