Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Memorizza più valori di bit in una singola colonna della tabella

Puoi archiviarlo come campo di bit e quindi utilizzare gli operatori di logica booleana per recuperare i valori

ad esempio:

CREATE TABLE [dbo].[testBF](
    [field1] [varchar](max) NOT NULL,
    [field2] [varchar](max) NOT NULL,
    [bitfield] [int] NOT NULL CONSTRAINT [DF_testBF_bitfield]  DEFAULT ((0))
) ON [PRIMARY]

Quindi per seleziona:

SELECT field1, field2,
       CASE WHEN (bitfield & 1) = 1 THEN 'monday ' ELSE '' END + 
       CASE WHEN (bitfield & 2) = 2 THEN 'tuesday ' ELSE '' END +
       CASE WHEN (bitfield & 4) = 4 THEN 'wednesday ' ELSE '' END +
       CASE WHEN (bitfield & 8) = 8 THEN 'thursday ' ELSE '' END +
       CASE WHEN (bitfield & 16) = 16 THEN 'friday' ELSE '' END as [days of week]
FROM testBF

Per trovare tutti i giorni che contengono il flag martedì (martedì è il 2° bit o 2^1 o 2)

SELECT * 
FROM aTable
WHERE (bitfield & 2) = 2

o

SELECT * 
FROM aTable
WHERE (bitfield & 2) != 0

Nota, il modello nel secondo caso funzionerà per qualsiasi bit, ovvero per venerdì (il 5° bit o 2^4 o 16) sarebbe

SELECT * 
FROM aTable
WHERE (bitfield & 16) != 0

Infine il caso generale... inserisci un numero (1 per lunedì) che ottieni

SELECT * 
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0

Mi sembra un sacco di lavoro, quando potresti semplicemente salvarlo come campi a 5 (o 7 bit), ma è così che potresti farlo.

Per ulteriori esempi, guarda il succo che ho scritto per un'altra domanda:

https://gist.github.com/1846338

e la risposta:

https://stackoverflow.com/a/9302106/215752