Anda bisa menyimpan ini sebagai bitfield dan kemudian menggunakan operator logika boolean untuk mengambil nilai
misalnya:
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]
Kemudian untuk pilihan:
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
Untuk menemukan semua hari yang mengandung bendera selasa (selasa adalah bit ke-2 atau 2^1 atau 2)
SELECT *
FROM aTable
WHERE (bitfield & 2) = 2
atau
SELECT *
FROM aTable
WHERE (bitfield & 2) != 0
Perhatikan, templat dalam kasus kedua akan berfungsi untuk bit apa pun -- yaitu untuk hari Jumat (bit ke-5 atau 2^4 atau 16) adalah
SELECT *
FROM aTable
WHERE (bitfield & 16) != 0
Akhirnya kasus umum... berikan nomor (1 untuk hari Senin) yang Anda dapatkan
SELECT *
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0
Ini tampak seperti banyak pekerjaan bagi saya, ketika Anda bisa menyimpannya sebagai bidang 5 (atau 7 bit) tetapi begitulah cara Anda melakukannya.
Untuk lebih banyak contoh lihat inti yang saya tulis untuk pertanyaan lain:
https://gist.github.com/1846338
dan jawabannya:
https://stackoverflow.com/a/9302106/215752