今天在给同事调取数据的时候,同事反馈说数据偏少,我仔细检查,发现sql语句条件都正确,逻辑没哪里不对,最后经过仔细排查,才发现问题出在null字段上
表中有一列是允许为null值,比如查询名字不为测试的商户名字的记录
我的查询为 name<>'测试'为10行,
select * from test name<>'测试'
检查数据 name='测试' 有90行, 总记录120行,有20行既不满足<>'测试',也不='测试',这20行记录name都是null
如下图所示,一看便明白:
在数据表行记录中,数据列中经常会有记录为null,其实null值表示的是未知数据,即空,表示什么也没有,
但不是我们所说的'',也不是表示数值0,而是表示未知数据。可以理解未知数据的点位符
null值的处理方式与其他值不同
null不能参与比较,因为是未知值,所以不能用在比较运算符后面,
name<>null,name=null,都是不正确的,
null值不能比较运算符,那怎么查询列值是null的呢,
我们必须使用 IS NULL 和 IS NOT NULL 操作符,
如查询名字为null 的用户
--记录为null SELECT COUNT(1) null记录数 FROM dbo.Users u WHERE u .Name IS NULL
查询名字不等于'aaaa'的用户记录:
--正确的名字不等于'aaaa' SELECT * FROM dbo.Users u WHERE ISNULL(u.Name,'')<>'aaaa'
实际上这里已经用到了isnull函数了,
isnull函数有两个参数,第一参数是要计算的表达式,第二个是当第一个表达式值为空时的替代值。