2012-01-27 37 views
10

Tôi có một cột INT trong cơ sở dữ liệu SQL Server lưu trữ một giá trị liên quan đến một điều tra cờ bit. Ví dụ, nếu enum là:Tháo số đếm cờ bit trong SQL Server

[Flags()] 
public enum UserType 
{ 
    StandardUser = 1, 
    Admin = 2, 
    SuperUser = 4 
} 

sau đó cột trong SQL Server có thể giữ giá trị 5.

Những gì tôi cần làm là chọn tất cả các hàng từ một bảng giữ chi tiết bổ sung về UserType, vì vậy, sử dụng ví dụ về giá trị là 5, tôi muốn chọn các hàng từ bảng thứ hai có ID 1 và 4.

Có ai biết cách phá vỡ số lượng theo cách này hay không - lý tưởng nhất phương pháp nên được đệ quy đến một mức độ nào đó vì đây là một ví dụ rất đơn giản, và các bảng/enums thực tế lớn hơn nhiều.

Trả lời

14
SELECT * FROM first_table f 
    JOIN second_table s ON s.ID & f.Flags <> 0 
    WHERE f.something = something 

Điều này sẽ chọn tất cả các hàng từ second_table khớp với bất kỳ cờ nào trên hàng nhất định trong bảng đầu tiên.

+0

điểm trên, nhờ :) – Bob

20

Để có được tất cả các hàng mà đó là sự thật cả mà 1 được thiết lập, và 4 được thiết lập ...

SELECT * FROM UserTable 
WHERE userType & 5 = 5 

Để có được tất cả các hàng mà nó là sự thật rằng ít nhất một trong 1 hoặc 4 được thiết lập ...

SELECT * FROM UserTable 
WHERE userType & 5 <> 0 

Và tất nhiên chúng ta có thể kết hợp này với tham gia:

SELECT Projects.* 
FROM Projects JOIN UserTable 
ON userID = UserTable.id 
WHERE userType & 5 <> 0 

Hoặc tham gia vào cờ. Nơi PermissionSets chứa cờ và người dùng phải có tất cả các thiết lập:

SELECT UserTable.* 
FROM UserTable JOIN PermissionSets 
ON UserTable.userType & PermissionSets.userType = PermissionSets.userType 
WHERE PermissionSets.id = 42 

nơi PermissionSets chứa cờ và người dùng phải có một thiết lập:

SELECT UserTable.* 
FROM UserTable JOIN PermissionSets 
ON UserTable.userType & PermissionSets.userType <> 0 
WHERE PermissionSets.id = 42 

Để bật các bit SuperUser cho người dùng với id của 93

UPDATE UserTable 
SET userType = userType | 4 
WHERE id = 93 

Để tắt số SuperUser bit cho người dùng có id là 93

UPDATE UserTable 
SET userType = userType & ~4 
WHERE id = 93 

Từ ADO.NET (hoặc bất kỳ) mã được sử dụng để đối phó với điều này từ C# chúng ta có thể vượt qua các diễn viên giá trị UserType liên quan đến int vào một tham số thay vì gửi 4 hoặc 5 một cách rõ ràng.

Chỉnh sửa: Xem thêm, Bitwise Operators (Transact-SQL)

+0

Cảm ơn Jon, siêu Giải thích – Bob

Các vấn đề liên quan