按IS NOT NULL和sql过滤

时间:2016-07-08 18:10:20

标签: sql sql-server stored-procedures

我有两个几乎相同的记录。一个包含"请求ID"的空值。而另一个没有。我想过滤掉那个没有该列空值的那个,但我也想过滤掉基于关键字的数据。

  

例如:
  搜索:ProjectName或Originator

     

结果:获取没有空的条目"请求ID"价值回归

搜索ProjectName可以获得我需要的东西但是搜索Originator仍然可以给我两个结果吗?

这是我到目前为止所做的:

this.getMenuInflater().inflate(2131165184, menu);

4 个答案:

答案 0 :(得分:9)

AND takes precedence over OR。您应该对ANDOR语句进行分组:

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