枚举添加位掩码到查找值

Enum addition bitmask to a lookup value

我确定以前有人问过这个问题,但是如果有人能引导我朝着正确的方向前进,我将不胜感激

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

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

如果我没理解错的话,你想要的是使用按位标志的能力。但是你的算术不起作用。每个 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');

EthnicityID 必须都是 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;

再次从数据库性能的角度来看,我不喜欢这样做。我不认为 Ethnicity table 会很大,所以它可能不会有什么大不了的,但你没有利用 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,'')