2012-01-27 11 views
10

Mam kolumnę INT w bazie danych SQL Server, która przechowuje wartość odnoszącą się do wyliczenia flagi bitowej. Na przykład, jeśli enum jest:Demontaż wyliczeń bitu flag w SQL Server

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

następnie kolumnę w SQL Server może posiadać wartość 5.

Co muszę zrobić, to wybrać wszystkie wiersze z innej tabeli gospodarstwa dodatkowe informacje o UserType, więc na przykładzie wartości 5, chciałbym wybrać wiersze z drugiej tabeli z identyfikatorami 1 i 4.

Czy ktoś zna sprytny sposób na rozbicie liczby w ten sposób - najlepiej metoda powinna być w pewnym stopniu rekurencyjna, ponieważ jest to bardzo uproszczony przykład, a rzeczywiste tabele/wyliczenia są znacznie większe.

Odpowiedz

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

To wybrałoby wszystkie wiersze z drugiej_ tabeli, które pasują do dowolnej flagi w danym wierszu w pierwszej tabeli.

+0

miejscu, thanks :) – Bob

20

Aby uzyskać wszystkie wiersze, dla którego prawdą jest, że zarówno 1 jest ustawiony, a 4 jest ustawiony ...

SELECT * FROM UserTable 
WHERE userType & 5 = 5 

Aby uzyskać wszystkie wiersze, dla którego prawdą jest, że co najmniej jeden z 1 lub 4 jest ustawiony ...

SELECT * FROM UserTable 
WHERE userType & 5 <> 0 

I oczywiście możemy połączyć to z przyłącza:

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

lub łączenia na flagi. Gdzie PermissionSets zawiera flagi i użytkownicy muszą mieć cały zestaw:

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

gdzie PermissionSets zawiera flagi i użytkownicy muszą mieć jeden zestaw:

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

Aby włączyć SuperUser bitu dla użytkownika o ID 93

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

Aby wyłączyć SuperUser trochę dla użytkownika o ID 93

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

Z ADO.NET (lub cokolwiek) kod, który jest używany do czynienia z tym od C# możemy przekazać odpowiednią obsadę UserType wartość int do parametru zamiast wysyłania 4 lub 5 wyraźnie.

Edycja: Patrz również Bitwise Operators (Transact-SQL)

+0

Dzięki Jon, super wyjaśnieniu – Bob