Możesz zapisać to jako pole bitowe, a następnie użyć operatorów logicznych, aby pobrać wartości
na przykład:
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]
Następnie dla wybranych:
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
Aby znaleźć wszystkie dni zawierające flagę wtorek (wtorek to drugi bit lub 2^1 lub 2)
SELECT *
FROM aTable
WHERE (bitfield & 2) = 2
lub
SELECT *
FROM aTable
WHERE (bitfield & 2) != 0
Zwróć uwagę, że szablon w drugim przypadku będzie działał dla dowolnego bitu -- czyli na piątek (5 bit lub 2^4 lub 16) będzie
SELECT *
FROM aTable
WHERE (bitfield & 16) != 0
Wreszcie ogólny przypadek... podaj liczbę (1 na poniedziałek), którą otrzymasz
SELECT *
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0
Wydaje mi się, że to dużo pracy, kiedy można było zapisać to jako 5 (lub 7-bitowe pola), ale tak można to zrobić.
Aby uzyskać więcej przykładów, spójrz na treść innego pytania, które napisałem:
https://gist.github.com/1846338
i odpowiedź:
https://stackoverflow.com/a/9302106/215752