Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Speichern Sie mehrere Bitwerte in einer einzigen Tabellenspalte

Sie könnten dies als Bitfeld speichern und dann boolesche Logikoperatoren verwenden, um die Werte abzurufen

zum Beispiel:

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]

Dann für wählt:

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

Um alle Tage zu finden, die das Dienstag-Flag enthalten (Dienstag ist das 2. Bit oder 2^1 oder 2)

SELECT * 
FROM aTable
WHERE (bitfield & 2) = 2

oder

SELECT * 
FROM aTable
WHERE (bitfield & 2) != 0

Beachten Sie, dass die Vorlage im zweiten Fall für jedes Bit funktioniert – das heißt für Freitag (das 5. Bit oder 2^4 oder 16) wäre

SELECT * 
FROM aTable
WHERE (bitfield & 16) != 0

Schließlich der allgemeine Fall ... geben Sie eine Zahl ein (1 für Montag), die Sie erhalten

SELECT * 
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0

Das scheint mir eine Menge Arbeit zu sein, wenn man es einfach als 5- (oder 7-Bit-Felder) speichern könnte, aber so könnte man es machen.

Weitere Beispiele finden Sie in der Zusammenfassung, die ich für eine andere Frage geschrieben habe:

https://gist.github.com/1846338

und die Antwort:

https://stackoverflow.com/a/9302106/215752