查询不喜欢返回奇怪的结果
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
我的查询有问题吗?
你的逻辑存在问题。我高度怀疑您应该用括号将 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 Like
s 和 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')
我被难住了的简单查询。我正在尝试过滤掉以 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
我的查询有问题吗?
你的逻辑存在问题。我高度怀疑您应该用括号将 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 Like
s 和 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')