如果你工作中用到了Oracle,你必須要留意NULL和空值的處理與SQL Server上的不同.現在讓我們看些例子。
建立這張數據庫表並插入記錄
CREATE TABLE TestNull(Col2 VARCHAR(100));
INSERT INTO TestNull VALUES(NULL);
INSERT INTO TestNull VALUES('Bla');
INSERT INTO TestNull VALUES('');
INSERT INTO TestNull VALUES(' ');
如你所見我們插入了4條記錄,一條記錄是null,一條記錄是空值,一條記錄是空格,一條記錄是"Bla".
讓我們執行下面的查詢語句:
下面是執行結果以html table顯示。SELECT Col2,
NVL(Col2,'EmptyOrNull') a,
COALESCE(Col2,'EmptyOrNull') b,
ASCII(col2) c
FROM TestNull;

下面是執行結果的截圖
看看發生了什么,Oracle把空值轉變成了 NULL。
我們能很容易的驗證這個猜想,建立一個有非NULL約束的單獨一列的表。
CREATE TABLE TestNull2(Col2 VARCHAR(100) NOT NULL);現在當你想插入一個 NULL,它會報錯。
INSERT INTO TestNull2 VALUES(NULL);
這是錯誤信息
SQL Error: ORA-01400: cannot insert NULL into ("SYSTEM"."TESTNULL2"."COL2")
01400. 00000 - "cannot insert NULL into (%s)"
插入"Bla"字符串沒有任何問題
INSERT INTO TestNull2 VALUES('Bla');
那么插入一個空值, 會報錯,會發生什么呢?
INSERT INTO TestNull2 VALUES('');
SQL Error: ORA-01400: cannot insert NULL into ("SYSTEM"."TESTNULL2"."COL2")
01400. 00000 - "cannot insert NULL into (%s)"
如你所見空值被轉換成NULL,你得到了和插入空值一樣的錯誤。這和SQL Server很不一樣。
插入一個空格會成功么?
INSERT INTO TestNull2 VALUES(' ');
插入空格沒有問題。
Coalesce函數的差別
要知道coalesce 函數工作原理不一樣. Oracle沒有isnull函數但有nvl函數來取代。
運行下面2句sql。
SELECT NVL('','No') AS a FROM dual;
SELECT COALESCE('','No') AS a FROM dual;
在這2種情況下你得到“No”返回值, 如你所見空值被當做null處理.
知道了Oralce和SQL Server的這些差別,如果你認為他們工作原理相同你會得到些奇怪的查詢結果。
1. SELECT COUNT(*) FROM DUAL WHERE '' = NULL; -- count(*)=0
2. SELECT COUNT(*) FROM DUAL WHERE '' IS NULL; -- count(*)=1
3. SELECT COUNT(*) FROM DUAL WHERE '' = ''; --count(*)=0

