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、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