Не как оператор странный счетчик результатов

У меня есть таблица с 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
Другие вопросы по тегам