Oracle数据库关联表后生成条件判断列的SQL查询需求
SQL查询:根据案件角色组合生成状态标识
我完全明白你的需求啦——要从关联后的表中,按案件分组查询两列:一列是案件编号,另一列根据案件里原告(Plaintiff)和被告(Defendant)的存在情况返回对应的状态值。
解决方案代码
这里直接给你可以复用的SQL语句,记得把你的关联表名换成实际的表名:
SELECT `Case#`, CASE -- 同时存在原告和被告 WHEN SUM(CASE WHEN Role = 'Plaintiff' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN Role = 'Defendant' THEN 1 ELSE 0 END) > 0 THEN 'OK' -- 仅存在被告 WHEN SUM(CASE WHEN Role = 'Defendant' THEN 1 ELSE 0 END) > 0 THEN 'def' -- 仅存在原告 WHEN SUM(CASE WHEN Role = 'Plaintiff' THEN 1 ELSE 0 END) > 0 THEN 'pltf' -- 两者都不存在 ELSE 'none' END AS Status FROM 你的关联表名 -- 如果需要过滤特定案件类型(比如只查Civil),可以加下面这行 -- WHERE CaseType = 'Civil' GROUP BY `Case#`;
代码解释
- 内层的
CASE WHEN会给每个匹配的角色标记为1,不匹配的为0,再用SUM统计每个案件里对应角色的总数量 - 外层的
CASE按优先级依次判断:先检查是否同时有原告和被告(优先级最高),再判断只有被告、只有原告的情况,最后兜底返回none - 通过
GROUP BY Case#确保每个案件只返回一条结果,对应唯一的状态值
如果你的数据库支持COUNT_IF函数(比如MySQL 8.0+、PostgreSQL),还可以简化内层的聚合逻辑,让代码更简洁:
SELECT `Case#`, CASE WHEN COUNT_IF(Role = 'Plaintiff') > 0 AND COUNT_IF(Role = 'Defendant') > 0 THEN 'OK' WHEN COUNT_IF(Role = 'Defendant') > 0 THEN 'def' WHEN COUNT_IF(Role = 'Plaintiff') > 0 THEN 'pltf' ELSE 'none' END AS Status FROM 你的关联表名 GROUP BY `Case#`;
内容的提问来源于stack exchange,提问作者John Haggin




