Bạn có thể lưu trữ dữ liệu này dưới dạng một trường bit và sau đó sử dụng các toán tử logic boolean để truy xuất các giá trị
ví dụ:
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]
Sau đó cho các lựa chọn:
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
Để tìm tất cả các ngày chứa cờ thứ ba (thứ ba là bit thứ 2 hoặc 2 ^ 1 hoặc 2)
SELECT *
FROM aTable
WHERE (bitfield & 2) = 2
hoặc
SELECT *
FROM aTable
WHERE (bitfield & 2) != 0
Lưu ý, mẫu trong trường hợp thứ hai sẽ hoạt động đối với bất kỳ bit nào - đó là đối với thứ sáu (bit thứ 5 hoặc 2 ^ 4 hoặc 16) sẽ là
SELECT *
FROM aTable
WHERE (bitfield & 16) != 0
Cuối cùng, trường hợp chung ... chuyển vào một số (1 cho thứ hai) bạn nhận được
SELECT *
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0
Điều này có vẻ như rất nhiều việc đối với tôi, khi bạn chỉ có thể lưu nó dưới dạng 5 (hoặc 7 trường bit) nhưng đó là cách bạn có thể làm điều đó.
Để biết thêm ví dụ, hãy xem ý chính mà tôi đã viết cho một câu hỏi khác:
https://gist.github.com/1846338
và câu trả lời:
https://stackoverflow.com/a/9302106/215752