Periscope平台SQL查询WHERE语句无法正确过滤近24小时数据问题求助
问题根因
你的SQL写法确实存在逻辑错误,核心是SQL逻辑运算符优先级导致的条件执行逻辑不符合预期:SQL中AND的运算优先级高于OR,你编写的WHERE条件实际执行时会被解析为如下逻辑:
(exampleX = exampleY) OR (exampleX is null AND productiondate > DATEADD(day,-1, GETDATE()) AND example1 <> 'XXX' AND example2 <> 'YYY' AND example2 <> 'ZZZ')
也就是说只要数据满足exampleX = exampleY,无论生产日期、其他筛选条件是否符合要求,都会被包含在查询结果里,这就是你会查到一周前数据的原因。
修正后的查询语句
只需要将OR关联的两个条件用括号括起来,明确为一个组合判断条件即可:
select example1, example2, example3, productiondate, example4, example5 from final where (exampleX = exampleY or exampleX is null) and productiondate > DATEADD(day,-1, GETDATE()) and example1 <> 'XXX' and example2 not in ('YYY', 'ZZZ') order by 2
可选优化点
- 涉及多条件组合、特别是包含
OR的场景,主动加括号明确运算优先级,避免依赖隐式优先级出现逻辑偏差 - 如果
productiondate是不带时分秒的日期类型,可将日期筛选调整为productiondate >= CAST(DATEADD(day,-1, GETDATE()) AS DATE),避免GETDATE()的时分秒导致昨日零点到当前执行时间前的部分数据被误过滤 - 多个同字段不等于判断可以替换为
NOT IN写法,简化代码提升可读性
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

