Můžete to uložit jako bitové pole a poté pomocí operátorů booleovské logiky načíst hodnoty
například:
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]
Poté pro výběry:
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
Chcete-li najít všechny dny, které obsahují příznak úterý (úterý je 2. bit nebo 2^1 nebo 2)
SELECT *
FROM aTable
WHERE (bitfield & 2) = 2
nebo
SELECT *
FROM aTable
WHERE (bitfield & 2) != 0
Všimněte si, že šablona v druhém případě bude fungovat pro jakýkoli bit -- to znamená pro pátek (5. bit nebo 2^4 nebo 16) by bylo
SELECT *
FROM aTable
WHERE (bitfield & 16) != 0
Konečně obecný případ... zadejte číslo (1 pro pondělí), které dostanete
SELECT *
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0
Zdá se mi to jako hodně práce, když to můžete uložit jako 5 (nebo 7 bitových polí), ale takhle byste to mohli udělat.
Pro více příkladů se podívejte na podstatu, kterou jsem napsal pro další otázku:
https://gist.github.com/1846338
a odpověď:
https://stackoverflow.com/a/9302106/215752