我有两个几乎相同的记录。一个包含"请求ID"的空值。而另一个没有。我想过滤掉那个没有该列空值的那个,但我也想过滤掉基于关键字的数据。
例如:
搜索:ProjectName或Originator结果:获取没有空的条目"请求ID"价值回归
搜索ProjectName可以获得我需要的东西但是搜索Originator仍然可以给我两个结果吗?
这是我到目前为止所做的:
this.getMenuInflater().inflate(2131165184, menu);
答案 0 :(得分:9)
AND
takes precedence over OR
。您应该对AND
和OR
语句进行分组:
SELECT *
FROM [dbo].[Resource_Request]
WHERE [Request ID] IS NOT NULL
AND
(
[Project Name] LIKE @ProjectName + '%'
OR [Originator] LIKE @Originator + '%'
)
分组的原因是由于上面提到的优先顺序。这个顺序是:
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiply), / (Division), % (Modulo)
3 + (Positive), - (Negative), + (Add), (+ Concatenate), - (Subtract), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
4 =, >, <, >=, <=, <>, !=, !>, !< (Comparison operators)
5 NOT
6 AND
7 ALL, ANY, BETWEEN, IN, LIKE, OR, SOME
8 = (Assignment)
这意味着,您的所有AND
语句都将首先进行评估。完成所有评估后,然后评估您的OR
语句。
这使您的查询看起来更像编译器:
WHERE
(
[Request ID] IS NOT NULL
AND [Project Name] LIKE @ProjectName + '%'
)
OR [Originator] LIKE @Originator + '%'
这不是您要寻找的条款。
通过对[Project Name]
子句的[Originator]
和WHERE
段进行分组,您告诉编译器应将这两个段作为一个集合进行评估,并使用AND
在该集合与[Request ID]
部分之间保持相同的优先级。
答案 1 :(得分:4)
将您的WHERE
条件分组,并将其括起来,如下所示
WHERE [Request ID] IS NOT NULL
AND
([Project Name] LIKE @ProjectName + '%'
OR [Originator] LIKE @Originator + '%')
答案 2 :(得分:2)
只需在此部分放置括号,您应该没问题:
(
[Project Name] LIKE @ProjectName + '%'
OR [Originator] LIKE @Originator + '%'
)
您遇到问题的原因是,OR
使得与Originator
过滤器相匹配的任何行的过滤器均为true,而不考虑其他过滤器,因此[Request ID] IS NOT NULL
过滤器会被忽略为只要[Originator] LIKE @Originator + '%'
。
答案 3 :(得分:2)
读取运算符优先级(和/或优先级适用于大多数语言和数学,而不仅仅是SQL)
https://msdn.microsoft.com/en-CA/library/ms190276.aspx http://en.wikipedia.org/wiki/Order_of_operations