Du kan lagra detta som ett bitfält och sedan använda booleska logiska operatorer för att hämta värdena
till exempel:
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]
Sedan för väljer:
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
För att hitta alla dagar som innehåller tisdagsflagga (tisdag är 2:a biten eller 2^1 eller 2)
SELECT *
FROM aTable
WHERE (bitfield & 2) = 2
eller
SELECT *
FROM aTable
WHERE (bitfield & 2) != 0
Observera att mallen i det andra fallet fungerar för vilken bit som helst -- det vill säga för fredag (den 5:e biten eller 2^4 eller 16) skulle vara
SELECT *
FROM aTable
WHERE (bitfield & 16) != 0
Slutligen det allmänna fallet... passera in ett nummer (1 för måndag) får du
SELECT *
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0
Det här verkar vara mycket jobb för mig, när du bara kunde spara det som 5 (eller 7 bitars fält) men det är så du kan göra det.
För fler exempel, titta på kärnan jag skrev för en annan fråga:
https://gist.github.com/1846338
och svaret:
https://stackoverflow.com/a/9302106/215752