2016-07-08 1 views
2

У меня есть две почти идентичные записи. Тот, который содержит нулевое значение для «Request ID», а другой - нет. Я хочу отфильтровать ту, которая не имеет нулевого значения для этого столбца, но я также хочу отфильтровать данные на основе ключевого слова.Фильтр по IS NOT NULL И в sql

Ex:
Поиск: ProjectName или составитель

Результат: получить запись без нулевой "Request ID" значение обратно

В поисках Projectname получает, что мне нужно но поиск Originator по-прежнему дает мне оба результата?

Вот то, что я до сих пор:

USE [ResourceRequest] 
GO 
    SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[search_project_bykeyword] 
(@ProjectName varchar(100)=NULL 
,@Originator varchar(100)=NULL) 
AS 
SELECT * 
FROM [dbo].[Resource_Request] 
WHERE [Request ID] IS NOT NULL 
AND 
[Project Name] LIKE @ProjectName + '%' 
OR [Originator] LIKE @Originator + '%' 

ответ

2

Просто поместите скобки вокруг этой части, и вы должны быть хорошо:

(
[Project Name] LIKE @ProjectName + '%' 
OR [Originator] LIKE @Originator + '%' 
) 

Причина вашей проблемы в том, что OR делает ваш filter true для любых строк, которые соответствуют фильтру Originator, независимо от других фильтров, поэтому фильтр [Request ID] IS NOT NULL игнорируется до тех пор, пока [Originator] LIKE @Originator + '%'.

+0

Спасибо, что нашли время, чтобы объяснить это. Я отвечу с вашего ответа, так как вы сначала ответили. Еще раз спасибо.:) – thatdude

4

Сгруппируйте WHERE условия по ним, как скобки ниже

WHERE [Request ID] IS NOT NULL 
AND 
([Project Name] LIKE @ProjectName + '%' 
OR [Originator] LIKE @Originator + '%') 
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] часть держит его на том же уровне приоритета.

+0

Хотя ваш код действительно решает проблему, утверждение «И имеет приоритет над OR» либо неоднозначно, либо просто неверно. –

+6

@Tab Alleman Как так? Кажется правильным и недвусмысленным для меня. https://msdn.microsoft.com/en-CA/library/ms190276.aspx – pabrams

+0

@pabrams Спасибо, просто искал это! – Siyual

Смежные вопросы