Чтобы получить все строки, для которых верно, задано и значение 1, и значение 4 ...
SELECT * FROM UserTable
WHERE userType & 5 = 5
Чтобы получить все строки, для которых верно, хотя бы одна из 1или 4 установлено ...
SELECT * FROM UserTable
WHERE userType & 5 <> 0
И, конечно, мы можем объединить это с объединениями:
SELECT Projects.*
FROM Projects JOIN UserTable
ON userID = UserTable.id
WHERE userType & 5 <> 0
Или объединением по флагам.Где PermissionSets содержит флаги, и у пользователей должен быть весь набор:
SELECT UserTable.*
FROM UserTable JOIN PermissionSets
ON UserTable.userType & PermissionSets.userType = PermissionSets.userType
WHERE PermissionSets.id = 42
Где PermissionSets содержит флаги, а у пользователей должен быть один набор:
SELECT UserTable.*
FROM UserTable JOIN PermissionSets
ON UserTable.userType & PermissionSets.userType <> 0
WHERE PermissionSets.id = 42
Чтобы включить бит SuperUser
для пользователяс идентификатором 93
UPDATE UserTable
SET userType = userType | 4
WHERE id = 93
Чтобы отключить бит SuperUser
для пользователя с идентификатором 93
UPDATE UserTable
SET userType = userType & ~4
WHERE id = 93
Из кода ADO.NET (или любого другого), который используется длясправившись с этим из C #, мы можем передать соответствующее значение UserType
, приведенное к int, в параметр, а не отправлять 4
или 5
явно.
Edit: см. также, Битовые операторы (Transact-SQL)