sql - 检查结果集的层次结构以修改“案例”条件
问题描述
查询已执行:
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。
解决方案
给定您的表名,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
推荐阅读
- firebase - 没有身份验证的 Firestore 安全规则
- database - 我无法在我的颤振应用程序中从 firebase 数据库中检索数据。我不知道我的代码有什么问题
- ssl - 谷歌云上的 KAFKA 负载均衡器在 SSL 端口上出错
- dart - 无法完成程序
- shell - Linux Shell 中 if 语句中的 in 子句
- eslint - 如果我有很多 eslint 错误,我想在运行 yarn start 时抛出错误
- javascript - 带有 Docker 的 Nuxt js:找不到模块:错误:无法解析
- nlp - 如何为 T5 模型使用 forward() 方法而不是 model.generate()
- javascript - 如何使用 jquery 获取 textarea 上每一行的值?
- android - kotlin java.lang.NumberFormatException:对于输入字符串:“null”