SQL中多列=1的OR条件能否简化?已尝试HAVING和IN无效
简化多列OR条件的SQL写法
你可以通过判断这些列的总和是否大于0,或者取最大值是否等于1来简化OR条件,以下是两种可行的写法:
方法1:用SUM判断至少一列等于1
(count(distinct case when (fiscal_mth_idnt_june21 + fiscal_mth_idnt_july21 + fiscal_mth_idnt_august21) > 0 then contact_key end)) / sum(fiscal_mth_idnt_may21)*100 as within_three_months
如果这些列的取值只有0和1,那么只要它们的和大于0,就说明至少有一个列等于1,和原来的OR逻辑完全一致。
方法2:用GREATEST函数取最大值
(count(distinct case when GREATEST(fiscal_mth_idnt_june21, fiscal_mth_idnt_july21, fiscal_mth_idnt_august21) = 1 then contact_key end)) / sum(fiscal_mth_idnt_may21)*100 as within_three_months
GREATEST会返回这几个列中的最大值,只要最大值是1,就意味着至少有一个列等于1,同样符合原逻辑。
为什么IN和HAVING没用?
- IN是用来判断单个列的值是否在某个集合里,比如
column IN (1,2,3),但你这里是多个不同的列,所以IN不适用。 - HAVING是用来过滤分组后的结果,而你的条件是在CASE WHEN里判断行级的列值,所以HAVING也帮不上忙。
内容的提问来源于stack exchange,提问作者live_happillyagain
相关产品推荐
相关产品推荐

