【问题标题】:Map bitwise enum to sql column value将按位枚举映射到 sql 列值
【发布时间】:2011-11-15 16:32:06
【问题描述】:

我有一个按位枚举,像这样设置了 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'

我知道我可以从 DB 中获取值,只需将 int 值类型转换为 MyEnum,它就会给我这些值。但是,我希望在某些存储过程中对 SQL 数据进行一些操作,显然我无法将其类型转换为 Enum 值。那么,有没有办法让我了解个人价值观。

例如,如果存储 11,我可以通过任何方式将其获取为 "1+2+8"

【问题讨论】:

  • 你可以有varchar列然后保存“1,2,8”吗?
  • 不,我无法更改数据库。它已经处于生产阶段。
  • SQL 应该不擅长按位运算;假设宁愿在 C# 领域做到这一点。
  • @jonathan:什么? SQL 擅长按位运算。
  • @Joe - 我的(SQL Server 团队)消息来源说“没有你想象的那么好”,但它可能是那些边缘/边界/微优化的事情之一。

标签: c# sql sql-server wpf tsql


【解决方案1】:

这可能有助于您入门:

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' 返回 1Select 11 & 2 As 'Second' 返回 2,Select 11 & 4 As 'Third' 返回 0 等等。

【讨论】:

  • 我个人喜欢这种方法的显式实现
  • 是的,这会让我继续前进。感谢您这么快的回复。
【解决方案2】:

你可以bitwise operations in 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

【讨论】:

  • 实际上,我的问题是我不知道这种组合。我只有值说 11 然后我想从中获得组合,即 1+2+8。如果我的值是 133,我需要得到值 '128+4+1'。
  • 如果你能给我一个小例子,那真的很有帮助。
  • 你是这个意思吗?即设置了哪些标志?
【解决方案3】:
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

(可能的)尾随加号留给读者作为练习。

【讨论】:

    【解决方案4】:
    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

    如果你只想得到 ids

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多