Вы утверждаете условия фильтра просто в пункте where
. Учитывая таблицу
create table foobar
(
id int not null primary key ,
c1 int not null ,
c2 int not null ,
c3 int not null ,
c4 int not null ,
c5 int not null ,
)
go
Вы можете сказать
select *
from foobar
where not ( 2 = case c1 when 1 then 1 else 0 end
+ case c2 when 1 then 1 else 0 end
+ case c3 when 1 then 1 else 0 end
+ case c4 when 1 then 1 else 0 end
+ case c5 when 1 then 1 else 0 end
and 1 = case c1 when 2 then 1 else 0 end
+ case c2 when 2 then 1 else 0 end
+ case c3 when 2 then 1 else 0 end
+ case c4 when 2 then 1 else 0 end
+ case c5 when 2 then 1 else 0 end
)
Другой подход, который может работать быстрее, чтобы использовать в качестве маски таблицы, содержащий условия, которые необходимо исключить. Что-то вроде этого:
create table mask
(
c1 tinyint null ,
c2 tinyint null ,
c3 tinyint null ,
c4 tinyint null ,
c5 tinyint null ,
unique clustered (c1,c2,c3,c4,c5) ,
)
В вашем случае, должны быть исключены только 30 Условия:
c1 c2 c3 c4 c5
---- ---- ---- ---- ----
NULL NULL 1 1 2
NULL NULL 1 2 1
NULL NULL 2 1 1
NULL 1 NULL 1 2
NULL 1 NULL 2 1
NULL 1 1 NULL 2
NULL 1 1 2 NULL
NULL 1 2 NULL 1
NULL 1 2 1 NULL
NULL 2 NULL 1 1
NULL 2 1 NULL 1
NULL 2 1 1 NULL
1 NULL NULL 1 2
1 NULL NULL 2 1
1 NULL 1 NULL 2
1 NULL 1 2 NULL
1 NULL 2 NULL 1
1 NULL 2 1 NULL
1 1 NULL NULL 2
1 1 NULL 2 NULL
1 1 2 NULL NULL
1 2 NULL NULL 1
1 2 NULL 1 NULL
1 2 1 NULL NULL
2 NULL NULL 1 1
2 NULL 1 NULL 1
2 NULL 1 1 NULL
2 1 NULL NULL 1
2 1 NULL 1 NULL
2 1 1 NULL NULL
(30 row(s) affected)
Фактический запрос тривиальна тогда (и если у вас есть покрывающий индекс на колонки для тестирования, тест проводится с индексом ищет и поэтому должны выполнять очень хорошо:
select *
from dbo.foobar t
where not exists (select *
from mask m
where t.c1 = m.c1
and t.c2 = m.c2
and t.c3 = m.c3
and t.c4 = m.c4
and t.c5 = m.c6
)
преимущество этого подхода состоит в том, что правила et is table-driven, что означает, что будущие изменения правил - это просто модификации данных в вашей таблице масок.
Вы также можете использовать положительный набор правил, но в вашем случае набор больше (> 200 положительных случаев, в отличие от 30 отрицательных случаев).
Какую базу вы используете? –
Что вы пытаетесь сделать, не совсем понятно, можете ли вы показать нам некоторые примеры данных, сообщающих нам, что следует и не следует включать? – Eluvatar
Ваш текст говорит о '1' и' 2', но ваш код использует '10' и' 11'. Что вы хотите использовать? – FrankPl