我确定之前已经问过这个问题,但如果有人能引导我朝着正确的方向前进,我会非常感激
我们有一个应用程序将种族数值存储在数据库中作为整数。
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
答案 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,'')