首页 > 解决方案 > 查询不喜欢返回奇怪的结果

问题描述

我被难住的简单查询。我正在尝试过滤掉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

我的查询有问题吗?

标签: sqlstringselectwhere-clausesql-like

解决方案


你有一个逻辑上的问题。我高度怀疑您应该OR用括号括住 ed 条件,如下所示:

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')

推荐阅读