sql >> Databasteknik >  >> RDS >> Sqlserver

Lagra flera bitvärden i en enda tabellkolumn

Du kan lagra detta som ett bitfält och sedan använda booleska logiska operatorer för att hämta värdena

till exempel:

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]

Sedan för väljer:

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

För att hitta alla dagar som innehåller tisdagsflagga (tisdag är 2:a biten eller 2^1 eller 2)

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

eller

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

Observera att mallen i det andra fallet fungerar för vilken bit som helst -- det vill säga för fredag ​​(den 5:e biten eller 2^4 eller 16) skulle vara

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

Slutligen det allmänna fallet... passera in ett nummer (1 för måndag) får du

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

Det här verkar vara mycket jobb för mig, när du bara kunde spara det som 5 (eller 7 bitars fält) men det är så du kan göra det.

För fler exempel, titta på kärnan jag skrev för en annan fråga:

https://gist.github.com/1846338

och svaret:

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



  1. Performance Issues:The First Encounter

  2. Finns det ett bästa sätt att undvika exekvering av processer mer än en gång i Oracle?

  3. Oracle Motsvarar MySQL INSERT IGNORE?

  4. Pymysql Cursor.fetchall() / Fetchone() Returnerar ingen