Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przechowuj wiele wartości bitowych w jednej kolumnie tabeli

Możesz zapisać to jako pole bitowe, a następnie użyć operatorów logicznych, aby pobrać wartości

na przykład:

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]

Następnie dla wybranych:

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

Aby znaleźć wszystkie dni zawierające flagę wtorek (wtorek to drugi bit lub 2^1 lub 2)

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

lub

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

Zwróć uwagę, że szablon w drugim przypadku będzie działał dla dowolnego bitu -- czyli na piątek (5 bit lub 2^4 lub 16) będzie

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

Wreszcie ogólny przypadek... podaj liczbę (1 na poniedziałek), którą otrzymasz

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

Wydaje mi się, że to dużo pracy, kiedy można było zapisać to jako 5 (lub 7-bitowe pola), ale tak można to zrobić.

Aby uzyskać więcej przykładów, spójrz na treść innego pytania, które napisałem:

https://gist.github.com/1846338

i odpowiedź:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to jest LEN() w SQL Server?

  2. Wstawianie dużych danych obiektowych do Salesforce.com z SQL Server

  3. Wyszukiwanie pełnotekstowe nie działa, jeśli dołączono słowo zatrzymania, mimo że lista słów zatrzymania jest pusta

  4. SQL Server:odpowiednik kaskadowej tabeli upuszczania?

  5. „Błąd krytyczny połączenia wewnętrznego” podczas wykonywania natywnie skompilowanej procedury przechowywanej w programie SQL Server 2019 (znany błąd)