在我的T-SQL查询中,过滤条件不能正常工作



我使用SQL Server 2016,我在我的查询中有以下代码行:

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

我需要所有的条件来站立。也就是说,f.Name必须等于'ABC Ltd', a.PackagePlanCode必须以'CO…', PropertyCode必须为'BIC'。

我在上面的代码行查询中看到一个不稳定的行为。A次,即使符合2个条件,也排除该记录。

我有一个记录在我的数据库中,它有以下内容:

Name = XYZ ltd

PackagePlanCode = COHB

PropertyCode = BIC

上面的记录不应该从我的结果集中排除,因为它只有2个条件(即PackagePlanCode和PropertyCode)满足我的过滤器,但它被排除在结果集中。

是否有更好的方法来编写此代码,以便我确信它不包括仅满足其中提到的所有3个条件的记录?

这不是一个解决方案。
(我怀疑连接或其他条件下的东西)

只是添加一个示例来显示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

最新更新