不像运算符奇怪的结果计数

时间:2014-08-11 08:55:10

标签: sql sql-server-ce-4

我有一张包含31,483条记录的表格。我想使用LIKE和NOT LIKE运算符搜索此表。用户可以选择包含或不包含选项。

当我执行LIKE时,where子句如下

WHERE Model LIKE '%test%'

将结果集过滤到1345条记录 - 所以一切都很好,Dandy

无论其

我预计在表上运行不喜欢会导致 n条记录,其中n = totalRowCount - LikeResultSet ,这会导致运行NOT LIKE操作时预期的记录数为30138。

我运行了这个WHERE子句:

WHERE Model NOT LIKE '%test%'

然而它返回了30526条记录。

我假设有一些我没有意识到的NOT LIKE运算符的复杂性。

所以我的问题

为什么我没有收到TotalRows的记录数 - LikeResults?

我正在使用SQL Server Compact 4.0 C# Visual Studio 2012

4 个答案:

答案 0 :(得分:1)

检查某些模型值是否为 nulls ,例如对于简单的人工桌

  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

答案 1 :(得分:0)

您的数据中有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

答案 2 :(得分:0)

您的WHERE子句应更改为WHERE ISNULL(Model,'') LIKE '%test%'以使用空字符串替换NULL。

答案 3 :(得分:0)

因为想要忽略空字段值而在查询中设置try isnull()函数。

  WHERE Model NOT LIKE '%test%' || isnull(Model)

它将返回30138条记录