首页 > 解决方案 > 检查结果集的层次结构以修改“案例”条件

问题描述

查询已执行:

case when type in ('A','B','C') then 0
else 1
end


RESULT:

ID, PARENT, TYPE
1        null         [result 1]
2   1       A     [result 0]
3   1       A     [result 0]

根据上述实现,0 是 ID 为 2 和 3 的行的结果。但是,作为 2,3 的父级的 ID 1 被设置为 1,因为列 'TYPE' 的值为 null

我希望能够检查:如果 TYPE 为空,但同一层次结构中的另一行的 TYPE 填充了值 A/B/C,则必须设置 0

预期结果:ID = 1 的行必须设置为 0 而不是 1。

标签: sqloracle

解决方案


给定您的表名,tab您必须执行以下操作:

CASE WHEN TYPE IS NULL AND EXISTS (SELECT 1 FROM tab t2 
                                    WHERE t2.parent = t1.id
                                      AND t2.TYPE IN ('A','B','C'))
     THEN 0                                       
     WHEN TYPE IN ('A','B','C') 
     THEN 0
     ELSE 1
END
FROM tab t1

它或多或少正是您所描述的,就像代码一样。如果它发生在您的数据中,您的数据中可能有多个类型为 null 的实例,例如:

ID  PARENT  TYPE
================
1   NULL    NULL
2   1       NULL
3   2       A
4   2       C

然后你必须使用分层子查询:

SELECT id
     , parent 
     , CASE WHEN TYPE IS NULL 
            THEN NVL((SELECT MIN(NVL2(TYPE,0,1)) -- If there is a child with TYPE in ('A','B','C') this will return 0
                        FROM tab t2
                       START WITH t2.parent = 1
                              AND (t2.TYPE IS NULL OR t2.TYPE IN ('A','B','C'))
                       CONNECT BY t2.parent = PRIOR t2.id
                              AND (t2.TYPE IS NULL OR t2.TYPE IN ('A','B','C')))
                    ,1) 
            WHEN TYPE IN ('A','B','C') 
            THEN 0
            ELSE 1
       END
FROM tab t1

推荐阅读