我正在使用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个条件的记录?
答案 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