Отображение побитового перечисления в значение столбца sql - PullRequest
8 голосов
/ 13 сентября 2011

У меня есть побитовое перечисление с FlagsAttribute, установленным над ним следующим образом -

[FlagsAttribute]
public enum MyEnum
{
    None = 0,
    First = 1,
    Second = 2,
    Third = 4,
    Five = 8,
    Six = 16,
    Seven = 32,
    Eight = 64,
    Nine = 128
}

Теперь в C # я сохраняю это значение в свойстве скажем MyProperty и при сохранении я записываю это свойство в базу данных SQLв целочисленном столбце.Предположим, что если я выберу First,Second,Five из кода, то в базе данных он будет сохранен как '11'.

. Я знаю, что могу извлечь значение из БД, и мне просто нужно типизировать int значение MyEnum, и это даст мнеценности.Но я хочу, чтобы некоторая манипуляция с данными SQL выполнялась в некоторой хранимой процедуре, где, очевидно, я не могу привести ее к значению Enum.Итак, есть ли выход, который может дать мне знать об отдельных значениях.

Как в примере, если хранится 11, любым способом, которым я могу получить его как "1+2+8"

Ответы [ 4 ]

11 голосов
/ 13 сентября 2011

Это может помочь вам начать:

Select 11 & 1 As 'First'
  , 11 & 2 As 'Second'
  , 11 & 4 As 'Third'
  , 11 & 8 As 'Five'
  , 11 & 16 As 'Six'
  , 11 & 32 As 'Seven'
  , 11 & 64 As 'Eight'
  , 11 & 128 As 'Nine';

Где 11 - ваше сохраненное значение.

Это вернет ненулевые значения для каждого установленного значения (т. Е.Select 11 & 1 As 'First' возвращает 1, Select 11 & 2 As 'Second' возвращает 2, Select 11 & 4 As 'Third' возвращает 0 и т. Д.

6 голосов
/ 13 сентября 2011

Вы можете выполнять побитовые операции в SQL

Select  *
From    MyTable
Where   MyEnum = (1 | 2 | 8)

Возвращать установленные флаги

Select  Case when (MyEnum & 1) = 1 Then 1 else 0 End as First,
        Case when (MyEnum & 2) = 2 Then 1 else 0 End as Second,
        Case when (MyEnum & 4) = 4 Then 1 else 0 End as Third,
        Case when (MyEnum & 8) = 8 Then 1 else 0 End as Fourth,
        Case when (MyEnum & 16) = 16 Then 1 else 0 End as Fifth
From    MyTable
0 голосов
/ 09 августа 2017
ID  Name
1   Zero
2   One
4   Two
8   Three
16  Four
32  Five

Значение 26 (или 11010) соответствует Один + Три + Четыре. Чтобы получить описание этого, вы можете использовать следующий запрос

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ' | ', '') + Name 
  FROM [Play].[dbo].[Enums]
  where (26 & ID)=ID
Select @Names;

Это даст вам следующий результат One | Three | Four

, если вы хотите получить только идентификаторы

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + STR(ID)
  FROM [Play].[dbo].[Enums]
  where (26 & ID)=ID
Select @Names;
0 голосов
/ 13 сентября 2011
declare @MyEnum as Int
set @MyEnum = 11
select
  case when ( @MyEnum & 1 ) = 1 then '1+' else '' end +
  case when ( @MyEnum & 2 ) = 2 then '2+' else '' end +
  case when ( @MyEnum & 4 ) = 4 then '4+' else '' end +
  case when ( @MyEnum & 8 ) = 8 then '8+' else '' end
  as Bitses

(возможный) завершающий плюс оставлен читателю в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...