如何在CASE语句中编写多条件(AND/OR组合)?条件未完全生效排查
解决CASE语句条件未完全校验的问题
你的问题核心是SQL逻辑运算符的优先级在搞鬼——AND的优先级高于OR,导致数据库对你的CASE条件做了不符合预期的解析,才会出现只判断ty.type='Catalog'就终止检查的情况。
问题拆解
先看你原始的条件部分:
ty.type ='Catalog' and zs.name='Aries' or zs.name='Leo' AND ( CASE when actual_finish_date is not null then actual_finish_date when updated_finish_date is not null then updated_finish_date else baseline_finish_date END ) is not null and visibility.ty_visibility !='Private'
数据库会优先计算AND连接的部分,所以这段逻辑会被解析成:
(ty.type='Catalog' AND zs.name='Aries') OR (zs.name='Leo' AND 日期条件 AND visibility条件)
这就意味着:
- 只要
ty.type='Catalog'且zs.name='Aries',不管日期和visibility是什么,都会返回1 - 而当
zs.name='Leo'时,甚至不会校验ty.type='Catalog'是否成立
这完全不符合你想要的“所有条件都要校验”的预期。
修正后的CASE语句
咱们需要用括号明确分组逻辑,确保先校验ty.type='Catalog',同时zs.name是'Aries'或'Leo',再去检查日期和visibility条件:
CASE WHEN ty.type = 'Catalog' AND (zs.name = 'Aries' OR zs.name = 'Leo') AND (CASE WHEN actual_finish_date IS NOT NULL THEN actual_finish_date WHEN updated_finish_date IS NOT NULL THEN updated_finish_date ELSE baseline_finish_date END) IS NOT NULL AND visibility.ty_visibility != 'Private' THEN 1 ELSE 0 END AS PARTICIPANT
逻辑说明
修正后的语句会按你预期的顺序校验所有条件:
- 首先确认
ty.type是'Catalog' - 然后确认
zs.name是'Aries'或者'Leo' - 接着检查日期字段(优先取actual_finish_date,其次updated_finish_date,最后baseline_finish_date)不为空
- 最后确认
visibility.ty_visibility不是'Private'
只有当所有条件都满足时,才会返回1,否则返回0。
内容的提问来源于stack exchange,提问作者Sherlock.H
相关产品推荐
相关产品推荐

