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
但是,如果它们是空字符串,
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
这将适用于 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'
如果您更改了架构,使您的表具有列ID
,并且risk_type
每种风险类型都有一行,您可以进行如下查询:
SELECT ID
FROM Table1
GROUP BY ID
HAVING COUNT(*) = 1
重新编辑:修改为不再指定他们拥有哪一种风险类型
如果风险值只有'Yes'
那么下面的查询将起作用
select ID from table where risk1||risk2||risk3||risk4='Yes'
如果风险的值只有'Yes'
并且空风险有spaces
而不是空值,那么下面的查询将起作用
select ID from table where replace(risk1||risk2||risk3||risk4,' ','')='Yes'