You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:39:58