sql >> Database >  >> RDS >> Sqlserver

Sla meerdere bitwaarden op in een enkele tabelkolom

U kunt dit opslaan als een bitveld en vervolgens booleaanse logische operatoren gebruiken om de waarden op te halen

bijvoorbeeld:

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]

Dan voor selecteert:

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

Om alle dagen te vinden die de dinsdagvlag bevatten (dinsdag is de 2e bit of 2^1 of 2)

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

of

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

Let op, de sjabloon in het tweede geval werkt voor elk bit -- dat is voor vrijdag (de 5e bit of 2^4 of 16) zou zijn

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

Eindelijk het algemene geval... geef een getal in (1 voor maandag) dat je krijgt

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

Dit lijkt me veel werk, terwijl je het gewoon zou kunnen opslaan als 5 (of 7-bits velden), maar dat is hoe je het zou kunnen doen.

Kijk voor meer voorbeelden naar de essentie die ik schreef voor een andere vraag:

https://gist.github.com/1846338

en het antwoord:

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



  1. Innerlijke join &outer join; is de volgorde van tabellen in van belangrijk?

  2. SQL Server 2017:Beschikbare functies op Linux

  3. Postgres ontbreekt FROM-clausule invoerfout bij query met WITH-component

  4. De regels van Codd in SQL