一个老生常谈的问题,前人已有描述,读者可参考http://www.51cto.com/art/200511/10681.htm(Oracle中null的使用详解)。不过,在实际编写pl/sql语,不小心仍旧会犯错误,有鉴于此,记录下来以便日后查询方便,避免犯低级错误。
本文以Oracle中null值为例,其它数据库如DB2,SQLServer,Sybase等大同小异。
1、四则运算
包含null值的+ - * /二元运算符处理后,输出值仍旧为null。即 1 + null, 1 - null, 1 * null, 1 / null, null + null, ...结果值为null。
-- 返回结果为NULL值
SELECT 1 + NULL FROM dual;
2、逻辑运算
包含null值的> < >= <=二元运算符处理后,输出值为false。即 1 > null, 1 < null, 1 >= null, 1 <= null, 1 <> null, null = null, 。
-- 结果集为空
SELECT * FROM dual WHERE 1 <> NULL;
若使用IS NULL或者IS NOT NULL判断,则符合预期。1 IS NOT NULL返回true,null is null返回true。
-- 结果集返回1条记录
SELECT * FROM dual WHERE 1 is not NULL;
3、聚合运算
若聚合的列全部为null值,则聚合函数输出null值,否则输出非空值的聚合运算结果。
-- 返回null, null, null, null
SELECT MAX(c1), MIN(c1), SUM(c1), AVG(c1)
FROM
(
SELECT NULL AS c1 FROM dual
UNION ALL
SELECT NULL AS c1 FROM dual
UNION ALL
SELECT NULL AS c1 FROM dual
)
WHERE 1 = 1;
-- 返回2, 1, 3, 1.5
SELECT MAX(c1), MIN(c1), SUM(c1), AVG(c1)
FROM
(
SELECT NULL AS c1 FROM dual
UNION ALL
SELECT 1 AS c1 FROM dual
UNION ALL
SELECT 2 AS c1 FROM dual
)
WHERE 1 = 1;
4、内嵌函数
对null值,调用Oracle内嵌函数(字符串/数值/日期等类型操作函数)基本上全部返回null值。
-- 返回null, null
SELECT substr(NULL, 1, 3), to_date(NULL, 'yyyymmdd')
FROM dual
对一些允许null值的字段进行操作时,要小心了,有时因为不注意导致最终查询结果与预期不一致,这很可能就是没有正确操作null值的原因造成的。