CASE WHEN中AND/OR逻辑导致统计结果异常的问题排查
问题根源与修复方法
核心错误:逻辑运算符优先级偏离需求
SQL中AND的优先级高于OR,你的CASE WHEN条件被数据库自动解析为:
n.country != o.country OR (n.user_tag != o.user_tag AND n.email_address = o.email_address)
这和你真实需求的**「n.email_address = o.email_address 且 (n.country != o.country 或 n.user_tag != o.user_tag)」**完全不符。
矛盾结果的原因
你单独查询country不等且email相等或user_tag不等且email相等时结果为0,说明不存在这两类数据。但合并查询得到10条,是因为原逻辑把**「country不等但email不等」**的记录错误统计进去了——这部分数据满足n.country != o.country,触发了OR的前半部分条件,被误计入统计。
修复后的SQL代码
用括号强制改变运算顺序,先验证email相等,再判断country或user_tag的不等条件:
COUNT(DISTINCT CASE WHEN n.email_address = o.email_address AND (n.country != o.country OR n.user_tag != o.user_tag) THEN n.email_address END) AS OTHER_CHANGES_IN_DATA FROM OLD o INNER JOIN NEW n ON n.user_id = o.user_id
验证建议
可以单独统计country不等但email不等的记录数,确认是否正好是10条:
COUNT(DISTINCT CASE WHEN n.country != o.country AND n.email_address != o.email_address THEN n.email_address END) AS COUNTRY_CHANGE_NO_EMAIL_MATCH FROM OLD o INNER JOIN NEW n ON n.user_id = o.user_id
内容的提问来源于stack exchange,提问作者hamesjendo
相关产品推荐
相关产品推荐

