8
votes

Carte Bitwise Enum à la valeur de la colonne SQL

J'ai une énumite bitwise avec FlagsAttribute Ensemble sur elle comme ceci -

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


6 commentaires

Pouvez-vous avoir une colonne VARCHAR, puis sauvegarder "1,2,8" à la place?


Non, je ne peux pas changer la dB. C'est déjà en phase de production.


SQL est censé être mal aux opérations bitwises; en supposant que cela préfère le faire dans la terre C #.


@jonathan: Quoi? SQL va bien dans les opérations bitwises.


@Joe - Mes sources (SQL Server Team) Dites "Pas aussi bien que vous le pensez," mais cela pourrait être l'une de ces choses marginales / frontières / micro-optimisation.


"Sources" étant des poteaux de blog MSDN de 1 ou 2 ans de retour.


4 Réponses :


6
votes

Vous pouvez faire Opérations Bitwise dans SQL

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


3 commentaires

En fait, ma question était que je ne suis pas au courant de la combinaison. Je n'ai que de valeur que de dire 11 en cela, je veux y avoir une association à partir de 1 + 2 + 8. Si j'avais la valeur 133, j'ai besoin d'obtenir la valeur '128 + 4 + 1'.


Ce sera vraiment utile, si vous pouvez me donner un petit exemple.


Est-ce ce que tu veux dire? c'est-à-dire que les drapeaux sont définis?



11
votes

Cela peut aider à vous aider à démarrer: xxx

11 est votre valeur stockée.

Ceci reviendra des valeurs non nulles Pour chaque valeur définie (c.-à-d. SELECT 11 & 1 en tant que 'First' Retours 1 , Sélectionnez 11 et 2 comme "secondaire" renvoie 2 , Sélectionnez 11 et 4 comme «troisième» renvoie 0 et ainsi de suite.


2 commentaires

Personnellement, j'aime cette approche pour sa mise en œuvre explicite


Oui, ça va me faire aller. Merci de votre réponse si rapide.



0
votes
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
The (possible) trailing plus is left as an exercise for the reader.

0 commentaires

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

0 commentaires