Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Armazenar vários valores de bits em uma única coluna da tabela


Você pode armazenar isso como um campo de bits e usar operadores lógicos booleanos para recuperar os valores

por exemplo:
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]

Então para seleciona:
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

Para encontrar todos os dias que contêm o sinalizador de terça-feira (terça-feira é o 2º bit ou 2^1 ou 2)
SELECT * 
FROM aTable
WHERE (bitfield & 2) = 2

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

Observe que o modelo no segundo caso funcionará para qualquer bit -- ou seja, para sexta-feira (o 5º bit ou 2^4 ou 16) seria
SELECT * 
FROM aTable
WHERE (bitfield & 16) != 0

Finalmente, o caso geral... passe um número (1 para segunda-feira) você obtém
SELECT * 
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0

Isso parece muito trabalho para mim, quando você pode salvá-lo como campos de 5 (ou 7 bits), mas é assim que você pode fazer isso.

Para mais exemplos, veja a essência que escrevi para outra pergunta:

https://gist.github.com/1846338

e a resposta:

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