Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Stocker plusieurs valeurs de bit dans une seule colonne de table

Vous pouvez stocker cela sous forme de champ de bits, puis utiliser des opérateurs logiques booléens pour récupérer les valeurs

par exemple :

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]

Ensuite pour les sélections :

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

Pour trouver tous les jours qui contiennent l'indicateur mardi (mardi est le 2ème bit ou 2^1 ou 2)

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

ou

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

Notez que le modèle dans le second cas fonctionnera pour n'importe quel bit -- c'est-à-dire pour vendredi (le 5ème bit ou 2^4 ou 16) serait

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

Enfin le cas général... passez un nombre (1 pour lundi) vous obtenez

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

Cela me semble être beaucoup de travail, alors que vous pourriez simplement l'enregistrer en tant que champs de 5 (ou 7 bits) mais c'est ainsi que vous pourriez le faire.

Pour plus d'exemples, regardez l'essentiel que j'ai écrit pour une autre question :

https://gist.github.com/1846338

et la réponse :

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