Sql 枚举向查找值添加位掩码

Sql 枚举向查找值添加位掩码,sql,sql-server,enums,bitmask,Sql,Sql Server,Enums,Bitmask,我相信这个问题以前有人问过,但是如果有人能把我引向正确的方向,我将不胜感激 我们有一个应用程序,它将种族值作为整数存储在数据库中 0 - None 1 - IDoNotWishToFurnish 2 - HispanicOrLatino 4 - NotHispanicOrLatino 8 - Mexican 16 - PuertoRican 32 - Cuban 64 - OtherHispanicOrLatino 我希望能够将所有这些求和的整数值转换为它们所尊重的选项 查询的结果如下所示

我相信这个问题以前有人问过,但是如果有人能把我引向正确的方向,我将不胜感激

我们有一个应用程序,它将种族值作为整数存储在数据库中

0 - None
1 - IDoNotWishToFurnish
2 - HispanicOrLatino
4 - NotHispanicOrLatino
8 - Mexican
16 - PuertoRican
32 - Cuban
64 - OtherHispanicOrLatino
我希望能够将所有这些求和的整数值转换为它们所尊重的选项

查询的结果如下所示

   PersonID        Name     Ethnicity   Ethnicity_Name
    1           Joe Smith   26          HispanicOrLatino,Mexican,PuertoRican
DECLARE @InputApplicationID INT = 1;
DECLARE @InputEthnicityIDs INT = 5; --Asian | Latino

INSERT INTO ApplicationEthnicity (ApplicationID, EthnicityID)
SELECT @InputApplicationID,
    E.EthnicityID
FROM Ethnicity AS E
WHERE E.EthnicityID & @InputEthnicityIDs = E.EthnicityID; --bitwise AND operation


SELECT * 
FROM ApplicationEthnicity;
如果这不是查询此信息的正确方法,请让我知道什么是最好的方法


我需要提取数据,以便能够集成到Salesforce中

如果我理解正确,您需要的是能够使用位标志。但是你的算术不行。每个EthnicityID必须是2的幂(1,2,4,8…),才能将所有数字相加为一个数字(从数据库性能的角度来看,不建议这样做)

种族ID必须都是2的幂才能起作用。如果对枚举使用C#中的[Flags]属性,则会自动执行此操作

如果你想拯救一个声称自己是亚裔和拉丁裔(1+4=5)的人,你的查询如下

   PersonID        Name     Ethnicity   Ethnicity_Name
    1           Joe Smith   26          HispanicOrLatino,Mexican,PuertoRican
DECLARE @InputApplicationID INT = 1;
DECLARE @InputEthnicityIDs INT = 5; --Asian | Latino

INSERT INTO ApplicationEthnicity (ApplicationID, EthnicityID)
SELECT @InputApplicationID,
    E.EthnicityID
FROM Ethnicity AS E
WHERE E.EthnicityID & @InputEthnicityIDs = E.EthnicityID; --bitwise AND operation


SELECT * 
FROM ApplicationEthnicity;
再次从数据库性能的角度来看,我不喜欢这样做。我不认为种族表会很大,所以可能不会有什么大不了的,但是你没有利用种族索引,你这样做(你打破了3NF)

要按应用程序查询种族查询,可以运行以下操作:

DECLARE @QueryApplicationID INT = 1;
SELECT STUFF(
    (Select ', ' + E.EthnicityName AS [text()]
     FROM dbo.ApplicationEthnicity AE
       INNER JOIN dbo.Ethnicity E
          ON AE.EthnicityID = E.EthnicityID
     WHERE AE.ApplicationID = @QueryApplicationID
      FOR XML PATH (''))
   ,1,1,'')

如果我理解正确,您需要的是使用位标志的能力。但是你的算术不行。每个EthnicityID必须是2的幂(1,2,4,8…),才能将所有数字相加为一个数字(从数据库性能的角度来看,不建议这样做)

种族ID必须都是2的幂才能起作用。如果对枚举使用C#中的[Flags]属性,则会自动执行此操作

如果你想拯救一个声称自己是亚裔和拉丁裔(1+4=5)的人,你的查询如下

   PersonID        Name     Ethnicity   Ethnicity_Name
    1           Joe Smith   26          HispanicOrLatino,Mexican,PuertoRican
DECLARE @InputApplicationID INT = 1;
DECLARE @InputEthnicityIDs INT = 5; --Asian | Latino

INSERT INTO ApplicationEthnicity (ApplicationID, EthnicityID)
SELECT @InputApplicationID,
    E.EthnicityID
FROM Ethnicity AS E
WHERE E.EthnicityID & @InputEthnicityIDs = E.EthnicityID; --bitwise AND operation


SELECT * 
FROM ApplicationEthnicity;
再次从数据库性能的角度来看,我不喜欢这样做。我不认为种族表会很大,所以可能不会有什么大不了的,但是你没有利用种族索引,你这样做(你打破了3NF)

要按应用程序查询种族查询,可以运行以下操作:

DECLARE @QueryApplicationID INT = 1;
SELECT STUFF(
    (Select ', ' + E.EthnicityName AS [text()]
     FROM dbo.ApplicationEthnicity AE
       INNER JOIN dbo.Ethnicity E
          ON AE.EthnicityID = E.EthnicityID
     WHERE AE.ApplicationID = @QueryApplicationID
      FOR XML PATH (''))
   ,1,1,'')

我一点也不清楚你想做什么。这是一个很好的起点。试图让事情变得更清楚,希望这会更有意义这不是一个处理数据的好方法。你真的应该规范化你的数据,而不是像这样的位掩码。如果你要使用位掩码,你需要使用1,2,4,8。不是1,2,3。如果添加4,当前方法会发生什么?你无法知道它是4还是1和3。我试图给出一个例子是远远不够的。我已经编辑了这个问题,并包含了正确的枚举值1,2,4,8,16。。等等。很抱歉弄糊涂了。这仍然不是处理多个选择的好方法。正确规范化的数据结构更容易使用。我根本不清楚您要做什么。这是一个很好的起点。试图让事情变得更清楚,希望这会更有意义这不是一个处理数据的好方法。你真的应该规范化你的数据,而不是像这样的位掩码。如果你要使用位掩码,你需要使用1,2,4,8。不是1,2,3。如果添加4,当前方法会发生什么?你无法知道它是4还是1和3。我试图给出一个例子是远远不够的。我已经编辑了这个问题,并包含了正确的枚举值1,2,4,8,16。。等等。很抱歉弄糊涂了。这仍然不是处理多个选择的好方法。正确规范化的数据结构更易于使用。我编辑了问题以表示正确的枚举值。这是处理此类非规范化数据的最佳方法。我编辑了问题以表示正确的枚举值。这是处理此类非规范化数据的最佳方法。