添加not_relevant条件后含PARTITION BY的SQL查询未生效问题
问题原因及解决方法
问题出在逻辑运算符优先级与括号的错误使用:
- SQL中
AND的优先级高于OR,你当前的WHERE条件会被数据库解析为:sn = 1 AND (checkbox IS NULL OR (checkbox = 0 AND not_relevant != 1)) - 这意味着只要
checkbox IS NULL成立,不管not_relevant是否为1,这条数据都会被选中,所以即使not_relevant=1,查询结果也不会变化。
修正后的SQL需要把checkbox的两个判断用括号包裹,确保和not_relevant的条件是同时满足的关系:
SELECT T.* FROM (SELECT *, row_number() OVER (PARTITION BY manager_id ORDER BY id) AS sn FROM my_table) T WHERE (sn = 1) AND ((checkbox IS NULL OR checkbox = 0) AND (not_relevant != 1))
或者拆分条件,写法更清晰:
SELECT T.* FROM ( SELECT *, row_number() OVER(PARTITION BY manager_id ORDER BY id) AS sn FROM my_table ) T WHERE sn = 1 AND (checkbox IS NULL OR checkbox = 0) AND not_relevant != 1
这样修改后,只有同时满足sn=1、checkbox为NULL或0、not_relevant不等于1的记录才会被筛选出来,就能正确排除not_relevant=1的数据了。
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

