Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Съхранявайте множество битови стойности в една колона на таблицата

Можете да съхраните това като битово поле и след това да използвате булеви логически оператори, за да извлечете стойностите

например:

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]

След това за селектира:

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

За да намерите всички дни, които съдържат флаг за вторник (вторник е 2-ри бит или 2^1 или 2)

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

или

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

Обърнете внимание, че шаблонът във втория случай ще работи за всеки бит - това е за петък (5-ти бит или 2^4 или 16) ще бъде

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

И накрая общият случай... внесете число (1 за понеделник), което получавате

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

Това ми се струва много работа, когато можете просто да го запазите като 5 (или 7-битови полета), но така бихте могли да го направите.

За повече примери вижте същността, която написах за друг въпрос:

https://gist.github.com/1846338

и отговорът:

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. Какво прави sp_reset_connection?

  2. SQL Server Collection Inventory Script -2

  3. Надстроих ODBC драйвера на SQL Server и производителността беше отрицателно засегната. Какво мога да направя?

  4. Какво е СТАТИСТИЧЕСКО ВРЕМЕ в SQL Server?

  5. Връщане на броя на редовете, засегнати от операторите UPDATE