SQL - 从多个标志获取具有唯一标志的 ID 的命令


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'

如果您更改了模式,使表中有IDrisk_type列,每一行对应一种风险类型,您可以有这样的查询:

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

SQLFiddle

re-edit:修改为不再指定他们具有哪一种风险类型

最新更新