MySQL Workbench下多条件CASE WHEN生成新列无法返回Multiple值求助
问题排查
你写的SQL没有返回预期的Multiple结果,核心问题出在嵌套CASE的逻辑设计:
- 外层CASE按顺序匹配到某一种族为
Yes后,如果存在其他种族也为Yes的场景,内层CASE没有匹配分支就会返回NULL,不会走到外层最后的else 'Multiple'分支,所以多种族选中的场景无法被正确识别。 - 没有按照规则优先级提前处理Black+Other、Hispanic+Other这两个特殊组合,逻辑判断顺序错误。
修正后SQL
你可以先统计每行选中的种族总数,再按规则优先级判断即可:
SELECT ID, Asian, Black, White, Hispanic, Pacific, Middle, Other, CASE -- 优先匹配Black+Other特殊规则:只要Black为Yes且无其他非Other种族选中,直接返回Black WHEN Black = 'Yes' AND Asian='No' AND White='No' AND Hispanic='No' AND Pacific='No' AND Middle='No' THEN 'Black' -- 优先匹配Hispanic+Other特殊规则:只要Hispanic为Yes且无其他非Other种族选中,直接返回Hispanic WHEN Hispanic = 'Yes' AND Asian='No' AND Black='No' AND White='No' AND Pacific='No' AND Middle='No' THEN 'Hispanic' -- 仅选中单个种族的场景,返回对应种族名 WHEN (Asian='Yes') + (Black='Yes') + (White='Yes') + (Hispanic='Yes') + (Pacific='Yes') + (Middle='Yes') + (Other='Yes') = 1 THEN CASE WHEN Asian='Yes' THEN 'Asian' WHEN White='Yes' THEN 'White' WHEN Pacific='Yes' THEN 'Pacific' WHEN Middle='Yes' THEN 'Middle' WHEN Other='Yes' THEN 'Other' END -- 排除两个特殊组合后,选中多个种族返回Multiple WHEN (Asian='Yes') + (Black='Yes') + (White='Yes') + (Hispanic='Yes') + (Pacific='Yes') + (Middle='Yes') + (Other='Yes') >= 2 THEN 'Multiple' -- 所有种族都为No返回Notreported ELSE 'Notreported' END AS Race FROM Test;
运行结果说明
用你提供的测试数据运行后,符合所有规则:
- ID9、ID13返回Black,ID12返回Hispanic,符合两个特殊组合要求
- ID10、ID11返回Multiple,符合多种族上报规则
- 其余单种族上报的行返回对应种族名
内容的提问来源于stack exchange,提问作者DBhatta
相关产品推荐
相关产品推荐

