数据库的空值(NULL)处理

上一篇 / 下一篇  2017-01-01 23:58:31 / 个人分类:数据库

数据库中经常需要对空值(NULL)做处理,比如“如果名称为空值则返回别名”,甚至还有更复杂的需求,比如“如果名称为空值则返回别名,如果别名也为空则返回‘佚名’两个字”、“如果名称为与别名相等则返回空值,否则返回名称”。这些需求已经带有流程控制的色彩了,一般来说需要在宿主语言中使用流程控制语句来进行处理,可是如果是在报表程序等大数据量的程序中把这些任务交给宿主语言的话会大大降低运行速度,因此我们必须想办法在SQL这一层进行处理。

将表对T_Person中Kerry的出生日期修改为空值,将Smith的出生日期和注册日期都修改为空值,执行下面的
SQL语句:
UPDATE T_Person SET FBirthDay=null WHERE FName='Kerry';
UPDATE T_Person SET FBirthDay=null AND FRegDay=null WHERE FName='Smith';

****
查询表如下初始数据
FIDNUMBER FNAME FBIRTHDAY FREGDAY FWEIGHT
123456789120 Tom 1981-03-22 1998-05-01 56.67
123456789121 Jim 1987-01-18 1999-08-21 36.17
123456789122 Lily 1987-11-08 2001-09-18 40.33
123456789123 Kelly 1982-07-12 2000-03-01 46.23
123456789124 Sam 1983-02-16 1998-05-01 48.68
123456789125 Kerry<NULL>1999-03-01 66.67
123456789126 Smith<NULL> <NULL>51.28
123456789127 BillGates 1972-07-18 1995-06-19 60.32
****

1、COALESCE()函数
主流数据库系统都支持COALESCE()函数,这个函数主要用来进行空值处理,其参数格式
如下:
COALESCE ( expression,value1,value2……,valuen)
COALESCE()函数的第一个参数expression为待检测的表达式,而其后的参数个数不定。COALESCE()函数将会返回包括expression在内的所有参数中的第一个非空表达式。如果expression不为空值则返回expression;否则判断value1是否是空值,如果value1不为空值则返回value1;否则判断value2是否是空值,如果value2不为空值则返回value3;……以此类推,如果所有的表达式都为空值,则返回NULL。

//返回人员的“重要日期”:如果出生日期不为空则将出生日期做为“重要日期”,如果出生日期为空则判断注册日期是否为空,如果注册日期不为空则将注册日期做为“重要日期”,如果注册日期也为空则将“2008年8月8日”做为“重要日期”
MYSQL、MSSQLServer、DB2:
SELECT FName,FBirthDay,FRegDay,
COALESCE(FBirthDay,FRegDay,'2008-08-08') AS ImportDay
FROM T_Person
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:001999-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

2、COALESCE()函数的简化版
COALESCE()函数可以用来完成几乎所有的空值处理,不过在很多数据库系统中都提供了
它的简化版,这些简化版中只接受两个变量,其参数格式如下:
MYSQL:
IFNULL(expression,value)
MSSQLServer:
ISNULL(expression,value)
Oracle:
NVL(expression,value)
这几个函数的功能和COALESCE(expression,value)是等价的。比如SQL语句用于返回人员的“重要日期”,如果出生日期不为空则将出生日期做为“重要日期”,如果出生日期为空则判断注册日期,如果注册日期不为空则将注册日期作为“重要日期”,否则返回NULL:
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

执行完毕我们就能在输出结果中看到下面的执行结果:
FBIRTHDAY FREGDAY IMPORTDAY
1981-03-22 00:00:00.0 1998-05-01 00:00:00.0 1981-03-22 00:00:00.0
1987-01-18 00:00:00.0 1999-08-21 00:00:00.0 1987-01-18 00:00:00.0
1987-11-08 00:00:00.0 2001-09-18 00:00:00.0 1987-11-08 00:00:00.0
1982-07-12 00:00:00.0 2000-03-01 00:00:00.0 1982-07-12 00:00:00.0
1983-02-16 00:00:00.0 1998-05-01 00:00:00.0 1983-02-16 00:00:00.0
<NULL> 1999-03-01 00:00:00.01999-03-01 00:00:00.0
<NULL> <NULL><NULL>
1972-07-18 00:00:00.0 1995-06-19 00:00:00.0 1972-07-18 00:00:00.0

3、NULLIF()函数
主流数据库都支持NULLIF()函数,这个函数的参数格式如下:
NULLIF ( expression1 , expression2 )
如果两个表达式不等价,则 NULLIF 返回第一个 expression1的值。如果两个表达式等价,则 NULLIF 返回第一个 expression1类型的空值。也就是返回类型与第一个 expression 相同。
下面的SQL演示了NULLIF()函数的用法:
SELECT FBirthDay,FRegDay,
NULLIF(FBirthDay,FRegDay)
FROM T_Person

执行完毕我们就能在输出结果中看到下面的执行结果:
FBirthDay FRegDay
1981-03-22 00:00:00.0 1998-05-01 00:00:00.0 1981-03-22 00:00:00.0
1987-01-18 00:00:00.0 1999-08-21 00:00:00.0 1987-01-18 00:00:00.0
1987-11-08 00:00:00.0 2001-09-18 00:00:00.0 1987-11-08 00:00:00.0
1982-07-12 00:00:00.0 2000-03-01 00:00:00.0 1982-07-12 00:00:00.0
1983-02-16 00:00:00.0 1998-05-01 00:00:00.0 1983-02-16 00:00:00.0
<NULL> 1999-03-01 00:00:00.0<NULL>
<NULL> <NULL><NULL>
1972-07-18 00:00:00.0 1995-06-19 00:00:00.0 1972-07-18 00:00:00.0

以上摘自《程序员的SQL金典》

TAG: 数据库

 

评分:0

我来说两句

Open Toolbar