Не как оператор странный счетчик результатов
У меня есть таблица с 31 483 записями. Я хотел бы найти эту таблицу, используя оператор LIKE и NOT LIKE. Пользователь может выбрать параметр "Содержит" или "Не содержит".
Когда я делаю LIKE, предложение where выглядит следующим образом
WHERE Model LIKE '%test%'
Который фильтрует результат, установленный до 1345 записей - так что все в порядке и Денди
ТЕМ НЕ МЕНИЕ
Я ожидал, что выполнение таблицы not like в таблице приведет к появлению n записей, где n = totalRowCount - LikeResultSet, что приведет к ожидаемому количеству записей 30138 при выполнении операции NOT LIKE.
Я запустил это предложение WHERE:
WHERE Model NOT LIKE '%test%'
Однако он вернул 30526 записей.
Я предполагаю, что есть некоторая запутанность оператора NOT LIKE, который я не понимаю.
так что мой вопрос
Почему я не получаю количество записей TotalRows - LikeResults?
Я использую SQL Server Compact 4.0 C# Visual Studio 2012
4 ответа
Проверьте, являются ли некоторые значения модели пустыми, например, для простой искусственной таблицы
with data as (
select 'test' as model
union all
select 'abc'
union all
select 'def'
union all
select null -- <- That's vital
)
ты получишь
-- 4 items
select count(1)
from data
-- 1 item: 'test'
select count(1)
from data
where model like '%test%'
-- 2 items: 'abc' and 'def'
select count(1)
from data
where model not like '%test%'
И так 1 + 2!= 4
Ваш WHERE
пункт должен быть изменен на WHERE ISNULL(Model,'') LIKE '%test%'
заменить NULL пустыми строками.
Потому что like и not like игнорирует нулевое значение поля для установки в запросе функции try isnull().
WHERE Model NOT LIKE '%test%' || isnull(Model)
вернет 30138 записей
Есть NULL
значение в ваших данных и LIKE
будет игнорировать NULL
значение.
Вы можете проверить это и увидеть поведение.
create table a
(
nama varchar(30)
)
insert into a values ('iswanto');
insert into a values (null);
insert into a values ('joko');
insert into a values ('tukul');
insert into a values ('iswanto2');
insert into a values (null);
select * from a where nama like '%w%' // 2 record
select * from a where nama not like '%w%' // 2 record
Если вы хотите включить NULL
значение в вашем запросе, попробуйте использовать функцию COALESCE.
select * from a where coalesce(nama, '') like '%w%' // 2 record
select * from a where coalesce(nama, '') not like '%w%' // 4 record