sql >> Databáze >  >> RDS >> Sqlserver

Uložte více bitových hodnot do jednoho sloupce tabulky

Můžete to uložit jako bitové pole a poté pomocí operátorů booleovské logiky načíst hodnoty

například:

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]

Poté pro výběry:

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

Chcete-li najít všechny dny, které obsahují příznak úterý (úterý je 2. bit nebo 2^1 nebo 2)

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

nebo

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

Všimněte si, že šablona v druhém případě bude fungovat pro jakýkoli bit -- to znamená pro pátek (5. bit nebo 2^4 nebo 16) by bylo

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

Konečně obecný případ... zadejte číslo (1 pro pondělí), které dostanete

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

Zdá se mi to jako hodně práce, když to můžete uložit jako 5 (nebo 7 bitových polí), ale takhle byste to mohli udělat.

Pro více příkladů se podívejte na podstatu, kterou jsem napsal pro další otázku:

https://gist.github.com/1846338

a odpověď:

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



  1. Jak vrátit všechna nedůvěryhodná omezení cizích klíčů na SQL Server (příklad T-SQL)

  2. Aktualizujte sloupec počtu z dat v jiné tabulce

  3. Ekvivalent SQLite DATEADD().

  4. Formátování příkazového řádku MySQL s UTF8