查询不喜欢返回奇怪的结果

Query Not Like returning odd results

我被难住了的简单查询。我正在尝试过滤掉以 4120 等结尾的作业。当我 运行 这个查询

select Job.Job, Job.Status from Job 
    Where(Job.Job Not Like '%4120'
          And Job.Job Not Like '%4235'
          And Job.Job Not Like '%4236'
          And Job.Job Not Like '%5910'
          And Status = 'Active' OR Status = 'Complete') 
    Order By Job.Job

我得到这些结果

    Job         Status
    01-19-4120  Complete
    01-19-4235  Complete
    01-19-5910  Complete
    02-19-4120  Complete
    02-19-4235  Complete
    02-19-4236  Complete
    02-19-5910  Complete
    03-07-4120  Complete
    03-19-4120  Complete
    03-19-4235  Complete
    03-19-5910  Complete
    04-19-4120  Complete
    04-19-4160  Complete

我的查询有问题吗?

你的逻辑存在问题。我高度怀疑您应该用括号将 ORed 条件括起来,如下所示:

Job.Job Not Like '%4120'
And Job.Job Not Like '%4235'
And Job.Job Not Like '%4236'
And Job.Job Not Like '%5910'
And (Status = 'Active' OR Status = 'Complete') 

解释:由于逻辑运算符 OR 的优先级低于 AND,因此您的 WHERE 条件实际上等同于:

(
    Job.Job Not Like '%4120'
    And Job.Job Not Like '%4235'
    And Job.Job Not Like '%4236'
    And Job.Job Not Like '%5910'
    And Status = 'Active' 
) OR Status = 'Complete' 

这允许 Status'Complete' 的任何记录,而不管 Job 的值,这不是您想要的。

此外,请注意,应该可以通过使用字符串函数而不是 Not Likes 和 in 条件而不是 Or 来简化这些条件。假设您的 RDBMS 支持 right():

right(Job.Job, 4) not in ('4120', '4235', '4236', '5910') 
and Status in ('Complete', 'Active')

您的 Status = 'Active' OR Status = 'Complete' 需要括号,因为现在您的查询执行为:

WHERE (Job.Job Not Like '%4120'
          And Job.Job Not Like '%4235'
          And Job.Job Not Like '%4236'
          And Job.Job Not Like '%5910'
          And Status = 'Active') OR (Status = 'Complete')

因此,无论 Job.Job 是什么,您都将获得 Status = 'Complete' 处的所有记录。要解决此问题,请尝试在您的状态检查周围添加括号:

Where(Job.Job Not Like '%4120'
      And Job.Job Not Like '%4235'
      And Job.Job Not Like '%4236'
      And Job.Job Not Like '%5910'
      And (Status = 'Active' OR Status = 'Complete'))

这是一个括号问题。通过将 OR 包含在括号内,您的说法是“给我所有匹配这些字符串且状态为活动或状态为完整的东西 - OR 将匹配不符合您的其他条件的记录。

select Job.Job, Job.Status from Job 
    Where(Job.Job Not Like '%4120'
          And Job.Job Not Like '%4235'
          And Job.Job Not Like '%4236'
          And Job.Job Not Like '%5910')
    And (Status = 'Active' OR Status = 'Complete') 
Order By Job.Job

如果 sql 服务器试试这个:

select Job.Job, Job.Status from Job 
    Where right(rtrim(Job.Job),4) Not in ('4120','4235','4236','5910')
          And Status = 'Active' OR Status = 'Complete') 
    Order By Job.Job

如果使用 in:

,则不需要括号
Where Job.Job Not Like '%4120' and
      Job.Job Not Like '%4235' and
      Job.Job Not Like '%4236' and
      Job.Job Not Like '%5910' and
      Status in ('Active', 'Complete') 

或者,如果您的数据库支持 left() 作为字符串函数:

where left(Job.Job, 4) not in ('4120', '4235', '4236', '5910') and
      Status in ('Active', 'Complete')