Mentre l'operatore bit a bit suggerito da James funzionerà, non sarà molto performante in un database relazionale, soprattutto quando si tenta di ridimensionare a milioni di record. Il motivo è che le funzioni nella clausola where non sono sargable (impediscono la ricerca di un indice).
Quello che vorrei fare sarebbe creare una tabella che contenga tutte le possibili combinazioni di flag e condizioni, che consentirà una ricerca dell'indice sulla condizione.
Compilare FlagConditions. Ho usato un singolo (minuscolo). Se avete bisogno di più bandiere, si dovrebbe essere in grado di espandere su questo approccio:
CREATE TABLE FlagConditions (
Flag TINYINT
, Condition TINYINT
, CONSTRAINT Flag_Condition PRIMARY KEY CLUSTERED (Condition,Flag)
);
CREATE TABLE #Flags (
Flag TINYINT IDENTITY(0,1) PRIMARY KEY CLUSTERED
, DummyColumn BIT NULL);
GO
INSERT #Flags
(DummyColumn)
SELECT NULL;
GO 256
CREATE TABLE #Conditions(Condition TINYINT PRIMARY KEY CLUSTERED);
INSERT #Conditions (Condition)
VALUES (1),(2),(4),(8),(16),(32),(64),(128);
INSERT FlagConditions (Flag, Condition)
SELECT
Flag, Flag & Condition
FROM #Flags f
CROSS JOIN #Conditions c
WHERE Flag & Condition <> 0;
DROP TABLE #Flags;
DROP TABLE #Conditions;
Ora è possibile utilizzare la tabella FlagConditions qualsiasi momento avete bisogno di cercare in modo efficiente su una condizione enum bit a bit:
DECLARE @UserFlags TABLE (Username varchar(10), Flag tinyint);
INSERT @UserFlags(Username, Flag)
VALUES ('User1',6),('User2',4),('User3',14);
DECLARE @Condition TINYINT = 2;
SELECT u.*
FROM @UserFlags u
INNER JOIN FlagConditions fc ON u.Flag = fc.Flag
WHERE fc.Condition = @Condition;
Ciò restituisce:
Username Flag
---------- ----
User1 6
User3 14
vostro DBA vi ringrazierà per andare questo set orientato percorso.
sarebbe più "SQL-like" per memorizzare questo informazioni in una tabella molti-a-molti. Quindi dovresti memorizzare le righe '(1,1), (1,2), (2,2), (3,1), (3,2), (3,3)' in una tabella separata. Sarebbe più naturale interrogare e offrire opportunità di indicizzazione. –