过滤条件在我的T-SQL查询中无法正常工作

时间:2016-10-13 05:37:53

标签: sql-server tsql filter multiple-conditions

我正在使用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'。

我在上面的代码行中查看了一个不稳定的行为。有时,即使有两个条件适合,也不包括该记录。

我的数据库中有一条记录,其中包含以下内容:

Name = XYZ ltd

PackagePlanCode = COHB

PropertyCode = BIC

上述记录不应该从我的结果集中排除,因为它只有2个标准(即PackagePlanCode和PropertyCode)符合我的过滤器,但它被排除在结果集之外。

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

1 个答案:

答案 0 :(得分: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