Oracle中的NULL

        在Oracle中使用NULL时,不少小伙伴遇到了很多坑,网上的关于NULL的说法也比较零散。在排序中,Oracle默认把NULL算作是无穷大,在order by语句作用后,NULL一直都是在最后的。有些人认为这是理所当然不对的,“空”在中国哲学概念中也是深奥莫测的,在所有运算和比较中,NULL就像一个数据黑洞,几乎把任何值都转化成NULL,这里不在哲学层面展开讨论。下面我们主要以Oracle官方文档(版本10gR2)作为依据,整理一下NULL的相关知识。

        如果在一条记录的一列中没有值,就说这一列为空,或者包含空值。NULL可以出现在没有限制为非空或者主键完整性约束的任何数据类型的列中。一个值未知或者没有意义时,可用NULL来表示。

        不可以用NULL代替数值0,他们不是等价的。

        注:Oracle数据库现在把空字符串作为NULL处理。然而,在Oracle未来的版本中可能不支持这种做法,建议不要将空字符串作为NULL来处理。

        任何包含NULL的算数表达式等价于NULL。例如:NULL + 10结果仍为NULL。事实上,所有的运算符(除了拼接符号concatenation),只要有一个操作数是NULL,都会返回NULL。

SQL函数中的NULL

        当接收到的参数有NULL时,所有的标量函数都会返回NULL值(除了REPLACE,NVL,CONCAT)。可以用NVL处理NULL值来返回一个非空值。例如,表达式NVL(comm,0)中,如果comm为空,则返回0,如果comm非空,则返回comm。

        大多数聚合函数都会忽略NULL。例如,有一个查询需要求1000,NULL,NULL,NULL,和2000这5个数的平均值。这个查询在计算的时候忽略NULL(不算数,不计数),计算过程等价于(1000 + 2000)/ 2 = 1500。

比较条件中的NULL

        为了检测NULL,只能用IS NULL 和IS NOT NULL这两个比较条件。如果用其他条件与NULL相比较,结果取决于NULL的值,因此结果是未知。因为NULL代表没有数据,一个NULL不可以等于或者不等于任何值或者另一个NULL。然而,Oracle在评估一个DECODE函数时,认为两个NULL是相等的。

筛选条件中的NULL

        一个被评估为未知的条件或者表达式,通常按FALSE处理。例如,一个在WHERE筛选条件中被评估为未知的SELECT语句,没有任何记录返回。

处理NULL值的函数

        NVL(expr1,expr2):如果expr1非空,返回expr1,如果expr1为空,返回expr2。

        NVL2(expr1,expr2,expr3):如果expr1非空,返回expr2,如果expr1为空,返回expr3。

        COALESCE(expr1,expr2,...,exprn):返回第一个非空值。

posted @ 2020-02-09 16:46  Samuel_Hu_115  阅读(616)  评论(0编辑  收藏  举报