Null是表示一种“未知”的类型,除了SQL已定义的数据类型外其他都是“未知”的类型。
-
Null不支持大小/相等判断
Null是“未知”类型,既然“未知”类型,那就无法判断一个未知类型或一个已知类型与一个未知类型是否相等或大或小。于是下面这个sql语句返回的是NULL
select null > 0;select null < 0;select null = 0;
判读是否是Null的方式是使用is null 或者 is not null
select 1 is not null;
-
[not] in 与 Null
例如:x not in (1,2,null) 等价于 x !=1 and x!=2 and x!=null 因为null与任何值比较都返回null所以一旦in后面的货号里有null值则整个查询结果都为null.
相反的如果是x in (1,2,null),则等价于是x=1 or x=2 or x=null,同理这种情况null会被忽略.
-
Null与排序与比较
在排序时可以使用coalesce函数将Null转换成0,coalesce的功能:
COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。使用COALESCE在于大部分包含空值的表达式最终将返回空值。
例如coalesce(age, 0)这样就可以将age为null的默认转换成0.排序时如果排序字段为null则会排在最前面,如果不想让这些null值记录排在前面,就可以使用coalesce函数消除null:
select * from user order by coalesce(age,0)
同理在比较的大小的时候也可以这样做,如果业务里Null等价于0(或者其他值)则可以用coalesce转换一下,例如:
select * from good where coalesce(price,0) > 55.5;select * from user where coalesce(age,0) in (,10,20,30);
-
被 0 除
除数为0是一个非常 egg-painfull 的错误。昨天还运行得好好的SQL,突然被0除一下子就出错了。一个常用的解决方法是先用 case 语句判断分母(denominator)是否为0,再进行除法运算。这种方式其实很难看,而且分母被重复使用了。如果是简单的情况还好,如果分母是个很复杂的表达式,那么悲剧就来了: 很难读,很难维护和修改,一不小心就是一堆BUG. 这是就可以使用null来解决,因为null除任何数都是null,所以可以使用nullif函数将可以能为0的值转出null(如果需要还可以再使用coalesce函数将null再转成其他值)
select coalesce(total_sales/nullif(num_users, 0), 0);