sql >> Database teknologi >  >> RDS >> Sqlserver

Gem flere bitværdier i en enkelt tabelkolonne

Du kan gemme dette som et bitfelt og derefter bruge boolske logiske operatorer til at hente værdierne

for eksempel:

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]

Vælg derefter:

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

For at finde alle dage, der indeholder tirsdagsflag (tirsdag er 2. bit eller 2^1 eller 2)

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

eller

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

Bemærk, skabelonen i det andet tilfælde vil fungere for enhver bit -- det vil sige for fredag ​​(den 5. bit eller 2^4 eller 16) ville være

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

Til sidst den generelle sag... indtast et tal (1 for mandag) får du

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

Det virker som meget arbejde for mig, når du bare kunne gemme det som 5 (eller 7 bit felter), men det er sådan du kunne gøre det.

For flere eksempler, se på hovedet, jeg skrev til et andet spørgsmål:

https://gist.github.com/1846338

og svaret:

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



  1. ADDDATE() Eksempler – MySQL

  2. MariaDB 10.6 og NextCloud:COMPRESSED Row er skrivebeskyttet som standard

  3. Gentagelse af rækker baseret på kolonneværdi i hver række

  4. Sådan tjekker du MySQL-versionen