枚举将位掩码添加到查找值

时间:2018-01-22 19:48:38

标签: sql sql-server enums bitmask

我确定之前已经问过这个问题,但如果有人能引导我朝着正确的方向前进,我会非常感激

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

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

如果这不是查询此信息的正确方法,请告诉我什么是最好的方法。

我需要提取数据,以便我可以集成到Salesforce

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要的是使用按位标志的能力。但是你的算术不起作用。每个EthnicityID必须是2(1,2,4,8 ......)的幂才能将所有数字加在一个数字中(不建议从数据库性能的角度来看)。

CREATE TABLE Application (
   ApplicationID INT,
   EthnicityID INT,
   PRIMARY KEY (ApplicationID, EthnicityID)
);

CREATE TABLE Ethnicity (
   EthnicityID TINYINT,
   EthnicityName VARCHAR(128),
   PRIMARY KEY (EthnicityID)
);

INSERT INTO Ethnicity (EthnicityID, EthnicityName)
VALUES
   (1, 'Asian'),
   (2, 'Hispanic'),
   (4, 'Latino');

种族ID必须是2的力量才能发挥作用。如果你在C#中使用[Flags]属性作为你的枚举,这将自动发生。

如果你想要救一个说他们是亚洲人和他们的人。拉丁裔(1 + 4 = 5),您的查询将如下所示

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;

再次从数据库性能的角度来看,我并不喜欢这样做。我不认为种族表会非常大,所以它可能不会是一个大问题,但你没有利用EthnicityID上的索引这样做(你打破了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,'')