lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

今天 做一道很简单的leetcode ,竟然 没有按预期一样得到结果 

lc 题

584. 寻找用户推荐人

 

 

 

最后查询发现了以下结论:

  • NULL和任何值都不能比较
  • NULL值与任何其它值的比较(即使是NULL)永远不会为“真”
  • NULL只能用is null 或者is not null 来判断,不能用=或者!=来判断

 

解决的办法两种

SELECT name
FROM customer
WHERE IFNULL(referee_id, -1) != 2


SELECT name
FROM customer
WHERE referee_id != 2
OR referee_id IS NULL
 

 

 

查找到某一个字段是null的记录,最简单的想法可能是这样:

select *from  tableName where columnName = null

但是这样是不行的,因为null不能和任何值比较。在SQL中,NULL值与任何其它值的比较(即使是NULL)永远不会为“真”。包含NULL的表达式总是会导出NULL值,除非在关于操作符的文档中以及表达式的函数中作了其他规定。

 

我曾经犯的错误如下:

注意,红色字体的查询条件只能查询出pass_name!='batch'且不为null的字段(null不能和任何值比较,即使是null也不会是 true),如果需要查询出pass_name是null的字段,必须显示的加上:or pass_name is NULL

SELECT COUNT(*) FROM 表名 WHERE FROM_UNIXTIME(submit_time) >= '2012-08-01' AND FROM_UNIXTIME(submit_time) < '2013-07-01' AND pass_name <> 'test'(错误)

查询出包含null且pass_name!='batch'的数据:

SELECT COUNT(*) FROM 表名 WHERE FROM_UNIXTIME(submit_time) >= '2012-08-01' AND FROM_UNIXTIME(submit_time) < '2013-07-01' AND (pass_name <> 'test' or pass_name is null)(正确查出pass_name!=null及pass_name是null的)

 

null表示的含义是未知,即不知道有没有。和‘’空字符串不等,因为空字符串相当于没有值。null代表的是不知道有没有值。所以在数据查询中如果字段默认值是null,想查询出不等于某个条件的一定要加上——字段名 is null 或者字段名 is not null来包含是null或者不是null的字段

 

posted on 2022-07-19 11:04  白露~  阅读(1293)  评论(0编辑  收藏  举报