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
    

    2番目の場合のテンプレートは、どのビットでも機能することに注意してください。つまり、金曜日(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. カーディナリティがパフォーマンスにどのように影響するかをご覧ください

    2. MySQLでEntityFrameworkウィザードがクラッシュする

    3. SQL Server Management Studio(SSMS)でクリップボードリングを循環する-SQL Server/TSQLチュートリアルパート8

    4. MySQLのデータベースクエリ効率の最大化-パート2-