आप इसे बिटफील्ड के रूप में स्टोर कर सकते हैं और फिर मूल्यों को पुनः प्राप्त करने के लिए बूलियन लॉजिक ऑपरेटरों का उपयोग कर सकते हैं
उदाहरण के लिए:
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^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