2016-10-13 4 views
0

Я использую SQL Server 2016 и у меня есть следующий код в моем запросе:состояние фильтра не работает должным образом в моем T-SQL запрос

AND NOT (f.Name = 'ABC Ltd' and a.PackagePlanCode like 'CO%' and c.PropertyCode = 'BIC') 

мне нужно все условия, чтобы стоять. То есть, f.Name должен быть равен «ABC Ltd», а a.PackagePlanCode ДОЛЖЕН начинаться с «CO ...», а PropertyCode ДОЛЖЕН быть «BIC».

Я вижу беспорядочное поведение в моем запросе с указанной выше строкой кода. Время, даже если 2 из условий соответствуют, оно исключает эту запись.

У меня есть запись в моей базе данных, которая имеет следующее:

Name = XYZ Ltd

PackagePlanCode = COHb

PropertyCode = BIC

выше записи не должны были исключены из моего результирующего набора, поскольку он имеет только 2 критерия (а именно PackagePlanCode и PropertyCode), которые соответствуют моему фильтру, и все же он исключен из набора результатов.

Есть ли лучший способ написать этот код, чтобы я был уверен, что он исключает записи, которые соответствуют только всем 3 условиям, упомянутым в нем?

+0

В скопированного кода, есть "AND NOT" перед скобками. Таким образом, это полностью изменяет логику предложения WHERE. Почему бы вам не удалить все это. Только внутри круглых скобок после WHERE – Eralper

+0

У меня есть другие условия, которые существуют после моего предложения WHERE. Это всего лишь один из них, и здесь я исключаю записи, соответствующие этим трем критериям. – user3115933

+0

И вы имеете в виду, что в наборе результатов есть строки, соответствующие этим критериям? Может ли это быть проблемой сопоставления, varchar или nvarchar? – Eralper

ответ

0

Это решение не предназначено.
(Я подозреваю, что в каких-либо других случаях соединения)

Просто добавьте пример, чтобы показать, что предложение WHERE работает так, как можно было бы ожидать от него. Если в любом случае нет NULL.

declare @T table (id int identity, num1 int, var1 varchar(30), var2 varchar(30), var3 varchar(30)); 

insert into @T (num1, var1, var2, var3) values 
(1,'Foo','Bar','Baz'), 
(1,'Foo','Bar','CO Baz'), 
(1,'Bar','Bar','CO Baz'), 
(1,'Foo','Bar',null), 
(1,'Foo',null,'CO Baz'); 

-- Query 1 
select * from @T 
where num1 > 0 
and NOT (var1 = 'Foo' and var2 = 'Bar' and var3 like 'CO%'); 

-- Query 2 
select * from @T 
where num1 > 0 
and NOT (coalesce(var1,'') = 'Foo' and coalesce(var2,'') = 'Bar' and coalesce(var3,'') like 'CO%'); 

-- Query 3 
select * from @T 
where num1 > 0 
and IIF(var1 = 'Foo' and var2 = 'Bar' and var3 like 'CO%',1,0) = 0; 

запрос 1 возвращает

id num1 var1 var2 var3 
1 1  Foo Bar Baz 
3 1  Bar Bar CO Baz 

Запрос 2 & 3 Возвращение

id num1 var1 var2 var3 
1 1  Foo Bar Baz 
3 1  Bar Bar CO Baz 
4 1  Foo Bar NULL 
5 1  Foo NULL CO Baz