男人站直别趴下,胜者困难不低头。
在开发过程中踩过的坑,在此做下记录,谨防下次入坑。
例:表table
A | B |
1 | null |
2 | 1 |
3 | 2 |
4 | 3 |
5 | 4 |
执行sql 如下
SELECT * FROM table WHERE B <> 3 //误以为会返回 id 为 1,2,3,5 四列,实际返回了 2,3,5 三列
得到结果如下
A | B |
2 | 1 |
3 | 2 |
5 | 4 |
第一列state为null的也被过滤掉
解决办法1
// 使用or查询
SELECT * FROM table WHERE B <> 3 OR B is Null
解决办法2
// 使用ifnull 函数 将 null 值转化为空字符串
SELECT * FROM table WHERE IFNULL(B,'') <> 3
踩坑原因
大多数编程语言都是基于二值逻辑的,即逻辑值只有true、false 两个。而sql语言采用的是三值逻辑,除了true、false 之外还有一个“unknown”。
--- 以下所有的都会返回unknown
1 = NULL
1 > NULL
1 < NULL
1 <> NULL
NULL <> NULL
即所有值与NULL比较都返回不确定