2013-03-06 47 views
1
ID Risk_1 Risk_2 Risk_3 Risk_4 
XYZ Yes    Yes  Yes 
ABC Yes 
PQR Yes  Yes 

正如您从上表中看到的那样,存在具有与它们相关的多种风险的ID。我想获得只有一个风险与他们相关的ID的输出。SQL - 使用来自多个标志的唯一标志获取Id的命令

在上述情况下,我想要所有只有risk_1的ID,所以结果应该是ABC。

我该如何使用SQL完成这项工作?

回答

2

假设Risks可为空

SELECT ID 
FROM tableName 
WHERE CASE WHEN Risk_1 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN Risk_2 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN Risk_3 IS NOT NULL THEN 1 ELSE 0 END + 
     CASE WHEN Risk_4 IS NOT NULL THEN 1 ELSE 0 END = 1 

但是,如果他们是空字符串,

SELECT ID 
FROM tableName 
WHERE CASE WHEN Risk_1 <> '' THEN 1 ELSE 0 END + 
     CASE WHEN Risk_2 <> '' THEN 1 ELSE 0 END + 
     CASE WHEN Risk_3 <> '' THEN 1 ELSE 0 END + 
     CASE WHEN Risk_4 <> '' THEN 1 ELSE 0 END = 1 
0

ŧ帽子将使用NULL,空字符串或除Yes之外的值(例如,否)

SELECT ID 
    FROM Table1 
    WHERE COALESCE(Risk_1, 'No') = 'Yes' AND 
     COALESCE(Risk_2, 'No') <> 'Yes' AND 
     COALESCE(Risk_3, 'No') <> 'Yes' AND 
     COALESCE(Risk_4, 'No') <> 'Yes' 

sqlfiddle

0

如果你改变了你的架构,以便您的表有列IDrisk_type与行每个风险类型,你可以有这样的查询:

SELECT ID 
FROM Table1 
GROUP BY ID 
HAVING COUNT(*) = 1 

SQLFiddle

重新编辑:修改为不再指定一个风险类型,他们有

0

如果风险价值仅为'Yes'然后在下面的查询将工作

select ID from table where risk1||risk2||risk3||risk4='Yes' 

如果风险价值仅为'Yes'和空的风险有spaces,而不是空的然后下面的查询将工作

select ID from table where replace(risk1||risk2||risk3||risk4,' ','')='Yes'