简介:
很多人知道ISNULL
函数,但是很少人知道Coalesce
函数,人们会无意中使用到Coalesce
函数,并且发现它比ISNULL
更加强大,其实到目前为止,这个函数的确非常有用,其实使用CASE WHEN THEN ELSE END
或者IF(column1 IS NULL,column2,column1)
本文主要讲解其中的一些基本使用:
COALESCE()函数:
主流数据库系统都支持COALESCE()
函数,这个函数主要用来进行空值处理,其参数格式如下:
COALESCE ( expression,value1,value2……,valuen)
COALESCE()
函数的第一个参数expression
为待检测的表达式,而其后的参数个数不定。COALESCE()
函数将会返回包括expression
在内的所有参数中的第一个非空表达式。
如果expression
不为空值则返回expression
;否则判断value1
是否是空值,
如果value1
不为空值则返回value1
;否则判断value2
是否是空值,
如果value2
不为空值则返回value2
;……以此类推, 如果所有的表达式都为空值,则返回NULL
。
示例:
我们将使用COALESCE()
函数完成下面的功能,返回人员的“重要日期”:
如果出生日期不为空则将出生日期做为“重要日期”,如果出生日期为空则判断注册日期是否为空,如果注册日期不为空则将注册日期做为“重要日期”,如果注册日期也为空则将“2008年8月8日”做为“重要日期”。实现此功能的SQL语句如下:
MYSQL、Spark、MSSQLServer、DB2:
SELECT
FName,
FBirthDay,
FRegDay,
COALESCE(FBirthDay,FRegDay,'2008-08-08') AS ImportDay
FROM T_Person
Oracle:
SELECT
FBirthDay,
FRegDay,
COALESCE(FBirthDay,FRegDay,TO_DATE('2008-08-08', 'YYYY-MM-DD HH24:MI:SS')) AS ImportDay
FROM T_Person
执行完毕我们就能在输出结果中看到下面的执行结果:
FName FBirthDay FRegDay ImportDay
Tom 1981-03-22 00:00:00 1998-05-01 00:00:00 1981-03-22 00:00:00
Jim 1987-01-18 00:00:00 1999-08-21 00:00:00 1987-01-18 00:00:00
Lily 1987-11-08 00:00:00 2001-09-18 00:00:00 1987-11-08 00:00:00
Kelly 1982-07-12 00:00:00 2000-03-01 00:00:00 1982-07-12 00:00:00
Sam 1983-02-16 00:00:00 1998-05-01 00:00:00 1983-02-16 00:00:00
Kerry <NULL> 1999-03-01 00:00:00 1999-03-01 00:00:00
Smith <NULL> <NULL> 2008-08-08
BillGates 1972-07-18 00:00:00 1995-06-19 00:00:00 1972-07-18 00:00:00
这里边最关键的就是Kerry和Smith这两行,可以看到这里的计算逻辑是完全符合我们的
需求的。COALESCE()
函数可以用来完成几乎所有的空值处理,不过在很多数据库系统中都提供了它的简化版,这些简化版中只接受两个变量,其参数格式如下:
MYSQL:
IFNULL(expression,value)
MSSQLServer:
ISNULL(expression,value)
Oracle:
NVL(expression,value)
这几个函数的功能和COALESCE(expression,value)
是等价的。
比如SQL语句用于返回人员的“重要日期”,如果出生日期不为空则将出生日期做为“重要日期”,如果出生日期为空则返回注册日期的值:
MYSQL:
SELECT
FBirthDay,
FRegDay,
IFNULL(FBirthDay,FRegDay) AS ImportDay
FROM T_Person
MSSQLServer:
SELECT
FBirthDay,
FRegDay,
ISNULL(FBirthDay,FRegDay) AS ImportDay
FROM T_Person
Oracle:
SELECT
FBirthDay,
FRegDay,
NVL(FBirthDay,FRegDay) AS ImportDay
FROM T_Person