枚举添加位掩码到查找值
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,'')
我确定以前有人问过这个问题,但是如果有人能引导我朝着正确的方向前进,我将不胜感激
我们有一个应用程序将种族值作为整数存储在数据库中。
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,'')