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