SQL Server 2017多条件数据筛选问题:WHERE子句AND/OR逻辑失效
分析你的SQL WHERE子句逻辑问题
先把你的原SQL条件块格式化出来,方便查看:
WHERE ([Campaign] NOT LIKE '%Search%') AND ( ([Campaign] = '2018 BRAND' AND [Tactic] <> 'Display' AND [Date] NOT BETWEEN '2018-01-01' AND '2018-04-27') OR ([Campaign] = '2017 BRAND' AND [Date] NOT BETWEEN '2017-01-01' AND '2017-01-07') )
从你的描述来看,这个语句没达到预期的数据集清理效果,我帮你排查几个常见的问题点:
1. 日期区间的NOT BETWEEN陷阱
如果你的[Date]字段是datetime/datetime2类型,'2018-04-27'会被SQL Server默认解析为'2018-04-27 00:00:00.000'。这意味着NOT BETWEEN '2018-01-01' AND '2018-04-27'会保留2018-04-27当天0点之后的所有记录,而不是排除整个2018-04-27日期。
如果你的需求是排除整个指定日期范围内的所有记录(包括2018-04-27全天),建议把NOT BETWEEN拆成两个明确的条件:
[Date] < '2018-01-01' OR [Date] >= '2018-04-28'
同理,2017年的条件也可以改成:
[Date] < '2017-01-01' OR [Date] >= '2017-01-08'
2. [Tactic] <> 'Display'的NULL值问题
如果你的[Tactic]字段存在NULL值,[Tactic] <> 'Display'会自动排除这些NULL记录(因为SQL中NULL和任何值比较都返回UNKNOWN,不会被包含在条件里)。如果需要保留Tactic为NULL的记录,要补充OR条件:
[Tactic] <> 'Display' OR [Tactic] IS NULL
3. 修正后的完整WHERE子句
结合上面的调整,修正后的语句如下:
WHERE [Campaign] NOT LIKE '%Search%' AND ( ( [Campaign] = '2018 BRAND' AND ([Tactic] <> 'Display' OR [Tactic] IS NULL) AND ([Date] < '2018-01-01' OR [Date] >= '2018-04-28') ) OR ( [Campaign] = '2017 BRAND' AND ([Date] < '2017-01-01' OR [Date] >= '2017-01-08') ) )
额外建议
如果还是不符合预期,你可以先单独测试每个条件块:
- 先执行
SELECT * FROM 你的表 WHERE [Campaign] NOT LIKE '%Search%',确认这部分过滤是对的; - 再分别测试两个OR分支的条件,看单独执行时是否返回你想要的记录;
- 逐步组合条件,定位到底是哪个部分的逻辑出了问题。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

