Вы можете сохранить это как битовое поле, а затем использовать логические операторы для получения значений
, например:
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]
Затем для выбора:
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
Чтобы найти все дни, которые содержат флаг вторника (вторник - 2-й бит или 2 ^ 1 или 2)
SELECT *
FROM aTable
WHERE (bitfield & 2) = 2
или
SELECT *
FROM aTable
WHERE (bitfield & 2) != 0
Обратите внимание, что шаблон во втором случае будетработать для любого бита - то есть для пятницы (5-й бит или 2 ^ 4 или 16) будет
SELECT *
FROM aTable
WHERE (bitfield & 16) != 0
Наконец, общий случай ... передать число (1 для понедельника) вы получите
SELECT *
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0
Мне кажется, что это большая работа, когда вы можете просто сохранить ее как 5 (или 7-битные поля), но именно так вы можете это сделать.
Для большего количества примеров посмотрите на суть, которую я написал для другого вопроса:
https://gist.github.com/1846338
и ответ:
https://stackoverflow.com/a/9302106/215752