ID Risk_1 Risk_2 Risk_3 Risk_4
XYZ Yes Yes Yes
ABC Yes
PQR Yes Yes
从上表中可以看出,有些id与多个风险相关联。我想得到一个id的输出,其中只有一个风险与它们相关联。
在上面的例子中,我想要所有只有risk_1的id,所以结果应该是ABC。
如何使用SQL完成此操作?
假设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
- <
- SQLFiddle演示/gh>
如果是空字符串,则
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
- <
- SQLFiddle演示/gh>
这将适用于null,空字符串或除Yes(例如No)以外的值
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
如果风险值仅为'Yes'
,则以下查询将有效
select ID from table where risk1||risk2||risk3||risk4='Yes'
如果风险值只有'Yes'
,并且空风险值为spaces
而不是null,则下面的查询将有效
select ID from table where replace(risk1||risk2||risk3||risk4,' ','')='Yes'
如果您更改了模式,使表中有ID
和risk_type
列,每一行对应一种风险类型,您可以有这样的查询:
SELECT ID
FROM Table1
GROUP BY ID
HAVING COUNT(*) = 1
SQLFiddle
re-edit:修改为不再指定他们具有哪一种风险类型